이전 포스팅에서 리사이클러뷰를 사용해서 간단한 전화번호부 앱을 만들었습니다.
이번에는 아이템 클릭, 수정, 삭제 기능을 추가 하겠습니다.
클릭 기능을 넣는 방법은 여러가지가 있습니다. 그 중 어댑터에 인터페이스를 만들어서
메인액티비에서 이벤트 처리를 하는 방식으로 구현 하겠습니다.
1.어댑터
public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder> {
......
//아이템 클릭 리스너 인터페이스
interface OnItemClickListener{
void onItemClick(View v, int position); //뷰와 포지션값
}
//리스너 객체 참조 변수
private OnItemClickListener mListener = null;
//리스너 객체 참조를 어댑터에 전달 메서드
public void setOnItemClickListener(OnItemClickListener listener) {
this.mListener = listener;
}
......
//뷰홀더 객체에 저장되어 화면에 표시되고, 필요에 따라 생성 또는 재활용 된다.
public class ViewHolder extends RecyclerView.ViewHolder {
......
itemView.setOnClickListener (new View.OnClickListener () {
@Override
public void onClick(View view) {
int position = getAdapterPosition ();
if (position!=RecyclerView.NO_POSITION){
if (mListener!=null){
mListener.onItemClick (view,position);
}
}
}
});
}
}
}
2.메인액티비티
public class MainActivity extends AppCompatActivity {
.....
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
......
//리사이클러뷰 아이템 클릭 이벤트
mAdapter.setOnItemClickListener (new Adapter.OnItemClickListener () {
//아이템 클릭시 토스트메시지
@Override
public void onItemClick(View v, int position) {
String name = mArrayList.get (position).getName ();
String number = mArrayList.get (position).getNumber ();
Toast.makeText (mContext, "이름 : "+name+"\n전화번호 : "+number, Toast.LENGTH_SHORT).show ();
}
});
}
}
아이템 터치시 토스트메시지를 띄었습니다.
리사이클러뷰 아이템에 수정, 삭제 버튼을 추가했습니다. 수정 버튼 클릭시 AlertDialog 를 사용하여 데이터를 수정했습니다. AlertDialog에 대한 포스팅이 아니기 때문에 설명은 생략 하겠습니다. 삭제버튼 클릭시 바로 삭제되게 구현했습니다.
1.다이얼로그.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="수정"
android:textSize="30sp"/>
<EditText
android:id="@+id/edit_editName"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<EditText
android:id="@+id/edit_editNumber"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<Button
android:id="@+id/btn_edit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="수정"/>
<Button
android:id="@+id/btn_cancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="취소"/>
</androidx.appcompat.widget.LinearLayoutCompat>
2.어댑터
....
interface OnItemClickListener{
void onItemClick(View v, int position); //뷰와 포지션값
void onEditClick(View v, int position); //수정
void onDeleteClick(View v, int positon);//삭제
}
....
public class ViewHolder extends RecyclerView.ViewHolder {
.....
public ViewHolder(@NonNull View itemView) {
.....
btn_edit.setOnClickListener (new View.OnClickListener () {
@Override
public void onClick(View view) {
int position = getAdapterPosition ();
if (position!=RecyclerView.NO_POSITION){
if (mListener!=null){
mListener.onEditClick (view,position);
}
}
}
});
btn_delete.setOnClickListener (new View.OnClickListener () {
@Override
public void onClick(View view) {
int position = getAdapterPosition ();
if (position!=RecyclerView.NO_POSITION){
if (mListener!=null){
mListener.onDeleteClick(view,position);
}
}
}
});
}
}
3.메인액티비티
public class MainActivity extends AppCompatActivity {
.....
@Override
protected void onCreate(Bundle savedInstanceState) {
.......
//리사이클러뷰 클릭 이벤트
mAdapter.setOnItemClickListener (new Adapter.OnItemClickListener () {
//아이템 클릭시 토스트메시지
@Override
public void onItemClick(View v, int position) {
String name = mArrayList.get (position).getName ();
String number = mArrayList.get (position).getNumber ();
Toast.makeText (mContext, "이름 : " + name + "\n전화번호 : " + number, Toast.LENGTH_SHORT).show ();
}
//수정
@Override
public void onEditClick(View v, int position) {
String name = mArrayList.get (position).getName ();
String number = mArrayList.get (position).getNumber ();
editItem (name, number, position);
}
//삭제
@Override
public void onDeleteClick(View v, int positon) {
mArrayList.remove (positon);
mAdapter.notifyItemRemoved (positon);
}
});
}
//AlertDialog 를 사용해서 데이터를 수정한다.
private void editItem(String name, String number, int position) {
AlertDialog.Builder builder = new AlertDialog.Builder (this);
View view = LayoutInflater.from (this).inflate (R.layout.dialog, null, false);
builder.setView (view);
final AlertDialog dialog = builder.create ();
final Button btn_edit = view.findViewById (R.id.btn_edit);
final Button btn_cancel = view.findViewById (R.id.btn_cancel);
final EditText edit_name = view.findViewById (R.id.edit_editName);
final EditText edit_number = view.findViewById (R.id.edit_editNumber);
edit_name.setText (name);
edit_number.setText (number);
// 수정 버튼 클릭
//어레이리스트 값을 변경한다.
btn_edit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view)
{
String editName = edit_name.getText ().toString ();
String editNumber = edit_number.getText ().toString ();
mArrayList.get (position).setName (editName);
mArrayList.get (position).setNumber (editNumber);
mAdapter.notifyItemChanged (position);
dialog.dismiss();
}
});
// 취소 버튼 클릭
btn_cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view)
{
dialog.dismiss();
}
});
dialog.show ();
}
}
Saram - > Cow 으로 수정.
Jisu 삭제 입니다.
데이터가 어디에 있는지 가 중요합니다. 지금까지 데이터를 mArraylist에 담았습니다.
그렇다면 mArraylist에 담긴 데이터를 수정하거나 삭제하면 될거라고 유추할 수 있습니다. 위 코드도 그런 방식으로 동작합니다. 데이터가 변경될 때 Adapter 의 notiyfy....() 호출해주는 것으로 리사이클러뷰의 데이터가 변경됩니다.
데이터 추가 절차
1.이름 전화번호 입력.
2.저장버튼 터치.
3.mArrayList에 데이터 추가.
4.mAdapter.notify...() 호출.
5.리사이클러뷰에 새 아이템 추가.
위 절차를 지나 리사이클러뷰에 아이템이 추가됩니다.
추가되는 예시입니다. 수정과 삭제절차는 한 번 생각해보시기 바랍니다.
두 포스팅에 걸쳐 리사이클러뷰를 사용해서 간단한 전화번호부 앱을 만들었습니다.
전체코드는 이전 포스팅을 같이 보면 알 수 있습니다. 시간이 되면 GitHub에 올리겠습니다.
전화번호부 앱이지만 데이터를 저장할 수 없습니다. 그래서 다음 포스팅은 저장기능을 추가해서 앱을 완성하겠습니다.