프로젝트 [자문자답 앱] - 기능 구현(3)

유의선·2023년 11월 8일
0

마지막 기능인 문제 풀기 화면에서 문제를 이전/다음 으로 이동시키는 기능을 구현하였다.


SolveActivity.java

문제의 리스트들을 보여주는 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);
            }
        });

SolveQActivity.java

먼저 문제 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;
        }

    }



업로드중..

0개의 댓글