마지막 기능인 문제 풀기 화면에서 문제를 이전/다음 으로 이동시키는 기능을 구현하였다.
문제의 리스트들을 보여주는 SolveAcitivty에서 몇 가지 내용을 수정하였다.
우선 데이터베이스에서 문제들을 받아와 리사이클러뷰에 추가하는 과정에서 첫 문제의 _id와 마지막 문제의 _id를 start와 end 변수에 저장하도록 하였다.
public void loadQuestionListData() {
...
for(int i = 0; i < recordCount; i++){
cursor.moveToNext();
int _id = cursor.getInt(0);
if(i == 0)
start = _id;
if(i == recordCount -1)
end = _id;
String Title = cursor.getString(1);
String Question = cursor.getString(2);
String Answer = cursor.getString(3);
adapter.addItem(new Question(_id, Title, Question, Answer));
}
...
그 후 각 문제를 눌러 문제 풀이 화면으로 이동할 때 전달하는 intent에 담는 내용을 수정하였다.
먼저 Question 객체 자체를 전달하지 않고 문제의 _id값만 전달하도록 하였다.
그리고 start와 end도 같이 전달하도록 하였다.
adapter.setOnItemClickListener(new OnQuestionClickListener() {
@Override
public void onItemClick(QuestionAdapter.ViewHolder holder, View view, int position) {
Question item = adapter.getItem(position);
Intent intent = new Intent(getApplicationContext(), SolveQActivity.class);
intent.putExtra("id", item.getNum());
intent.putExtra("start", start);
intent.putExtra("end", end);
startActivity(intent);
}
});
먼저 문제 id의 처음과 끝을 저장할 start와 end 객체와
Cursor 객체를 전역변수로 선언했다.
public class SolveQActivity extends AppCompatActivity {
TextView title;
TextView question;
String answer;
int id;
int start, end;
Cursor cursor = null;
이전 액티비티에서 받은 intent 객체에서 문제의 id와 start, end를 받아 저장하였다.
if(intent != null){
Bundle bundle = intent.getExtras();
id = bundle.getInt("id");
start = bundle.getInt("start");
end = bundle.getInt("end");
}
그 후 데이터베이스를 열어 Cursor 객체로 모든 인덱스를 받고, 처음 문제를 선택할 때 받은 id 값으로 문제를 찾아서 그 값을 저장하고 보여지도록 설정하였다.
이 때 Cursor 객체는 그 위치에서 멈추도록 하였다.
...
// 데이터베이스와 커서를 설정하고, 처음 선택된 문제로 커서를 이동한 후 문제 설정
initQuestion();
...
private void initQuestion() {
QuestionDatabase database = null;
if(cursor != null){
cursor.close();
cursor = null;
}
database = QuestionDatabase.getInstance(this);
String sql = "select _id, TITLE, QUESTION, ANSWER FROM " + QuestionDatabase.TABLE_QUESTION + " order by _id ASC";
cursor = database.rawQuery(sql);
int recordCount = cursor.getCount();
for(int i = 0; i < recordCount; i++){
cursor.moveToNext();
int _id = cursor.getInt(0);
if(_id == id){
setQuestion();
break;
}
}
}
private void setQuestion(){
id = cursor.getInt(0);
title.setText(cursor.getString(1));
question.setText(cursor.getString(2));
answer = cursor.getString(3);
}
문제의 id와 start, end와 비교해 만약 첫번째 문제라면 '이전 문제' 버튼이 비활성화 되도록, 마지막 문제라면 '다음 문제' 버튼이 비활성화되도록 하였다.
if(id == start)
buttonBefore.setEnabled(false);
if(id == end)
buttonAfter.setEnabled(false);
'이전 문제' 버튼이 눌리면 커서를 하나 뒤로 이동시킨 후 문제를 설정하도록,
'다음 문제' 버튼이 눌리면 커서를 하나 앞으로 이동시킨 후 문제를 설정하도록 하였다.
이 때 문제의 id값을 start/end 값과 비교하여 버튼을 활성/비활성화 시킨다.
// 뒤로 버튼이 눌리면 커서를 하나 뒤로 이동시킨 후 문제 설정
buttonBefore.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
cursor.moveToPrevious();
setQuestion();
if(id == start){
buttonBefore.setEnabled(false);
}else{
buttonBefore.setEnabled(true);
}
if(id == end){
buttonAfter.setEnabled(false);
}else{
buttonAfter.setEnabled(true);
}
}
});
// 앞으로 버튼이 눌리면 커서를 하나 다음으로 이동시킨 후 문제 설정
buttonAfter.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
cursor.moveToNext();
setQuestion();
if(id == start){
buttonBefore.setEnabled(false);
}else{
buttonBefore.setEnabled(true);
}
if(id == end){
buttonAfter.setEnabled(false);
}else{
buttonAfter.setEnabled(true);
}
}
});
마지막으로 액티비티가 종료될 때 커서를 닫도록 하였다.
@Override
protected void onDestroy() {
super.onDestroy();
if(cursor != null){
cursor.close();
cursor = null;
}
}