[ Android Studio ] #19. ToDoList 어플을 만들어보자 - 리싸이클러뷰 어댑터 연결

ma.caron_g·2022년 2월 3일
0
post-thumbnail

< 참고 링크 >

[ Note 클래스 생성 ]

데이터들을 담아둘 객체 클래스를 정의합시다.
/app/java/com.study.todolist(패키지명)에 Note클래스를 만들어봅시다.

그리고 int형의 _id, String형의 todo를 정의합니다.

_id는 데이터베이스를 만들 때 만든 _id대로 정렬할 때 쓰고, todo는 EditText에 입력한 것들을 저장할 때 씁니다.

아래와 같이 변수를 정의해 주고 빈 공간에 마우스 오른쪽 클릭을 해주어 Generate를 눌러줍니다.

그 후 Getter and Setter를 이용해

_idtodoset(),get() 메서드를 만들어줍니다.

두 변수를 선택해주고 OK를 눌러줍니다.

그럼 자동으로 메서드들이 생성되게 됩니다.

[ NoteAdapter 클래스 생성 ]

Note를 만들었으니 어댑터를 만들어봅시다.
/app/java/com.study.todolist(패키지명)NoteAdapter클래스를 생성합니다.

NoteAdapter에 RecyclerView.Adapter를 상속하고 NoteAdapter의 태그를 만들어줍니다.

이후 이 클래스 내에서 리싸이클러뷰의 어댑터 역할을 하기 위해 상속합니다.

package com.study.todolist;

import android.view.View;

import androidx.recyclerview.widget.RecyclerView;

public class NoteAdapter extends RecyclerView.Adapter<NoteAdapter.ViewHolder> {
     private static final String TAG = "NoteAdapter";
}

위 코드와 같이 작성해주면 ViewHolder에 오류가 발생하는데
마우스를 올려 implement methods를 클릭하여 OK를 눌러줍니다.

implement methods가 안 보인다면 More actions...를 눌러서 implement methods를 눌러준다.

그럼 3가지의 메서드가 자동 완성됩니다.

빨간색 에러들은 수정하면서 고쳐나가보겠습니다.

아이템들이 들어갈 배열을 정의하기 위해

ArrayList<Note> items = new ArrayList<Note>();

코드를 추가하여 리스트를 선언해줍니다.




그 후 ViewHolder의 역할을 하기 위해 RecyclerView.ViewHolder를 상속한 static class ViewHolder를 만들어주고
안에 ViewHolder 메서드를 만들고 super메서드를 이용하여 View를 만들어줍니다.

static class ViewHolder extends RecyclerView.ViewHolder{
        
        public ViewHolder(View itemView) {
            super(itemView);
    }
}

그리고 아이템들으 가지고있는 역할을 하는 것이 ViewHolder이기 때문에 이전에 todo_item.xml에서 만들었던 LinearLayout, CheckBox, Button변수를 ViewHolder클래스 내에서 선언하고 ViewHolder메서드 안에서 각각의 id에 맞게 연결한 뒤 그 역할을 정의해줍니다.

앞에서 저장 버튼의 클릭 이벤트를 설정했던 것처럼 삭제 버튼을 정의해봅시다.

static class ViewHolder extends RecyclerView.ViewHolder{

        LinearLayout layoutTodo;
        CheckBox chkTodo;
        Button btnRemove;

        public ViewHolder(View itemView) {
            super(itemView);

            layoutTodo = itemView.findViewById(R.id.layoutToDo);
            chkTodo = itemView.findViewById(R.id.chkToDo);
            btnRemove = itemView.findViewById(R.id.btnRemove);

            btnRemove.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    String TODO = (String) chkTodo.getText();
                    removeToDo(TODO);
                    Toast.makeText(view.getContext(), " 삭제되었습니다.", Toast.LENGTH_SHORT).show();
                }

                private void removeToDo(String TODO){

                }
            });
        }
    }

삭제 버튼을 누르면 해당 아이템은 text를 받아 text와 같은 데이터베이스의 값을 삭제할 것입니다.
그리고 Toast.makeText를 이용하여 사용자에게 삭제됨을 알립니다.




EditText에서 입력받은 CheckBox의 텍스트를 CheckBox의 Text에 넣을 수 있게 하는 메서드와 아이템들을 담은 LinearLayout을 보여주게하는 메서드를 정의해봅시다.

static class ViewHolder extends RecyclerView.ViewHolder{

        LinearLayout layoutTodo;
        CheckBox chkTodo;
        Button btnRemove;

        public ViewHolder(View itemView) {
            super(itemView);
          
            layoutTodo = itemView.findViewById(R.id.layoutToDo);
            chkTodo = itemView.findViewById(R.id.chkToDo);
            btnRemove = itemView.findViewById(R.id.btnRemove);
       
            btnRemove.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View view) {
                    String TODO = (String) chkTodo.getText();
                    removeToDo(TODO);
                    Toast.makeText(view.getContext(), " 삭제되었습니다.", Toast.LENGTH_SHORT).show();
                }

                private void removeToDo(String TODO) {

                }
            });
        }

삭제 버튼을 누르면 삭제 버튼을 누른 아이템의 Text를 받아 Text와 같은 데이터베이스의 값을 삭제할 것입니다.
그리고 Toast.makeText()를 이용하여 사용자에게 삭제됨을 알립니다.

그리고 EditText에서 입력 받은 CheckBox의 텍스트를 CheckBoxText에 넣을 수 있게 하는 메서드와 아이템들을 담은 LinearLayout을 보여주게하는 메서드를 정의해봅시다.

위 코드에

//ViewHolder 클래스 안 (메서드x)
...
    public void setItem(Note item) {
        chkTodo.setText(item.getTodo());
    }
    public void setLayout(){
        layoutTodo.setVisibility(View.VISIBLE);
    }
//View Holder 끝.
}



ViewHolder 클래스를 빠져나와서 배열에 있는 item들을 가리키는 메서드들을 정의해봅시다

public void setItems(ArrayList<Note> items) {
    this.items = items;
}



이제는 정의한 메서드들을 본격적으로 써먹어봅시다.

todo_item.xml을 인플레이션하는 다음 코드를 적어봅시다.
위에 오류를 수정하기로 했던 onCreateViewHolder()

LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        View itemView = inflater.inflate(R.layout.todo_item, parent, false);

        return new ViewHolder(itemView);

이 코드 덕분에 저희는 이전에 만든 CheckBoxbtnRemove을 포함한 아이템들을 띄울 수 있습니다.

이제는 onBindViewHolder를 건드려봅시다.

다음 코드를 입력해주세요.

Note item = items.get(position);
holder.setItem(item);
holder.setLayout();

밑에서 만들었던 메서드를 여기서 활용합니다.

마지막으로 getItemCount()메서드에 returnitems.size();로 합시다

return items.size();

[ MainFragment 클래스 ]

MainFragment의 initUI에서 어댑터를 설정해줍니다.
우선 MainFragmen클래스에 RecyclerView, NoteAdpater 변수를 정의해줍니다.

RecyclerView recyclerView;
NoteAdapter adapter;

그리고 initUI에 다음 클래스 코드를 추가합니다.

private void initUI(ViewGroup rootView) {

        //fragment_main.xml에 만들었던  RecyclerView를 연결.
        recyclerView = rootView.findViewById(R.id.recylcerView);

        //LinearLayout을 이용하여 LinearLayout에 recyclerView를 붙입니다.
        //이 후 이것은 todo_item들이 세로로 하나하나 정렬하는 역할을 하게 됩니다.
        LinearLayoutManager layoutManager = new LinearLayoutManager(getContext());
        recyclerView.setLayoutManager(layoutManager);

        //어댑터들을 연결하는 역할을 하게 됩니다.
        adapter = new NoteAdapter();
        recyclerView.setAdapter(adapter);
    }

모든 코드를 작성하면 에뮬레이터에서 다음과 같은 메인화면이 정확하게 나오게 됩니다.

"일정 추가" 버튼을 누르면 아래와 같이 "추가되었습니다" 알림 기능이 실행됩니다.

profile
다른 사람이 만든 것을 소비하는 활동보다, 내가 생산적인 활동을 하는 시간이 더 많도록 생활화 하자.

0개의 댓글