안드로이드 리사이클러뷰2, 수정 삭제 - 전화번호부 앱

YAMAMAMO·2021년 11월 1일
0

이전 포스팅에서 리사이클러뷰를 사용해서 간단한 전화번호부 앱을 만들었습니다.

이번에는 아이템 클릭, 수정, 삭제 기능을 추가 하겠습니다.

1.클릭기능

클릭 기능을 넣는 방법은 여러가지가 있습니다. 그 중 어댑터에 인터페이스를 만들어서

메인액티비에서 이벤트 처리를 하는 방식으로 구현 하겠습니다.

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 ();
            }

        });

    }
}

아이템 터치시 토스트메시지를 띄었습니다.

2.수정, 삭제 기능

리사이클러뷰 아이템에 수정, 삭제 버튼을 추가했습니다. 수정 버튼 클릭시 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에 올리겠습니다.

전화번호부 앱이지만 데이터를 저장할 수 없습니다. 그래서 다음 포스팅은 저장기능을 추가해서 앱을 완성하겠습니다.

profile
안드로이드 개발자

0개의 댓글