< 참고 링크 >
데이터들을 담아둘 객체 클래스를 정의합시다.
/app/java/com.study.todolist(패키지명)에 Note클래스를 만들어봅시다.
그리고 int형의 _id, String형의 todo를 정의합니다.
_id는 데이터베이스를 만들 때 만든 _id대로 정렬할 때 쓰고, todo는 EditText에 입력한 것들을 저장할 때 씁니다.
아래와 같이 변수를 정의해 주고 빈 공간에 마우스 오른쪽 클릭을 해주어 Generate를 눌러줍니다.
그 후 Getter and Setter를 이용해
_id와 todo의 set()
,get()
메서드를 만들어줍니다.
두 변수를 선택해주고 OK를 눌러줍니다.
그럼 자동으로 메서드들이 생성되게 됩니다.
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
의 텍스트를 CheckBox
의 Text에 넣을 수 있게 하는 메서드와 아이템들을 담은 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);
이 코드 덕분에 저희는 이전에 만든 CheckBox
와 btnRemove
을 포함한 아이템들을 띄울 수 있습니다.
이제는 onBindViewHolder
를 건드려봅시다.
다음 코드를 입력해주세요.
Note item = items.get(position);
holder.setItem(item);
holder.setLayout();
밑에서 만들었던 메서드를 여기서 활용합니다.
마지막으로 getItemCount()
메서드에 return
을 items.size();
로 합시다
return items.size();
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);
}
모든 코드를 작성하면 에뮬레이터에서 다음과 같은 메인화면이 정확하게 나오게 됩니다.
"일정 추가" 버튼을 누르면 아래와 같이 "추가되었습니다" 알림 기능이 실행됩니다.