RecyclerView에서 데이터를 추가/삭제/편집할 수 있도록 구현한 예제입니다.




아래 포스트를 수정하여 진행합니다. 아래 포스트를 먼저 진행하세요. 



Android  RecyclerView 간단한 예제

http://webnautes.tistory.com/1214




데이터 추가는 기존대로 화면 아래쪽에 있는 버튼을 사용해서 이루어집니다. 

RecyclerView의 특정 줄을 길게 터치시 컨텍스트 메뉴(context menu)에  편집/삭제 항목이 보이며 선택하면 해당 줄에 있는 데이터를 대상으로 편집/삭제가 진행됩니다.  




실행 결과를 먼저 보여주고 이후 관련 코드를 설명하는 식으로 진행합니다. 




1. 데이터 추가


2. 데이터 편집


3. 데이터 삭제


4. 코드 수정



최초작성 2018. 8. 9

최종작성 2019. 8. 22




1. 데이터 추가

실행시킨 후,  데이터 추가 버튼을 누르면 





RecyclerView에 데이터 입력을 위한 다이얼로그가 보입니다. 원하는 내용을 입력 후, 삽입 버튼을 터치하면  






RecyclerView에 해당 내용이 입력됩니다. 




MainActivity.java


        Button buttonInsert = (Button)findViewById(R.id.button_main_insert);
        buttonInsert.setOnClickListener(new View.OnClickListener() {


            // 1. 화면 아래쪽에 있는 데이터 추가 버튼을 클릭하면 
            @Override
            public void onClick(View v) {

                // 2. 레이아웃 파일 edit_box.xml 을 불러와서 화면에 다이얼로그를 보여줍니다.

                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);

                View view = LayoutInflater.from(MainActivity.this)
                        .inflate(R.layout.edit_box, null, false);
                builder.setView(view);


                final Button ButtonSubmit = (Button) view.findViewById(R.id.button_dialog_submit);
                final EditText editTextID = (EditText) view.findViewById(R.id.edittext_dialog_id);
                final EditText editTextEnglish = (EditText) view.findViewById(R.id.edittext_dialog_endlish);
                final EditText editTextKorean = (EditText) view.findViewById(R.id.edittext_dialog_korean);
               
                ButtonSubmit.setText("삽입");

                final AlertDialog dialog = builder.create();


                // 3. 다이얼로그에 있는 삽입 버튼을 클릭하면 

                ButtonSubmit.setOnClickListener(new View.OnClickListener() {


                    public void onClick(View v) {


                        // 4. 사용자가 입력한 내용을 가져와서
                        String strID = editTextID.getText().toString();
                        String strEnglish = editTextEnglish.getText().toString();
                        String strKorean = editTextKorean.getText().toString();
                        

                        // 5. ArrayList에 추가하고 

                        Dictionary dict = new Dictionary(strID, strEnglish, strKorean );
                        mArrayList.add(0, dict); //첫번째 줄에 삽입됨
                        //mArrayList.add(dict); //마지막 줄에 삽입됨


                        // 6. 어댑터에서 RecyclerView에 반영하도록 합니다. 

                        mAdapter.notifyItemInserted(0);
                        //mAdapter.notifyDataSetChanged();

                        dialog.dismiss();
                    }
                });

                dialog.show();
            }
        });




2. 데이터 편집


원하는 항목에서 길게 누르면 컨텍스트 메뉴가 보입니다.  편집부터 선택해보면 





기존에 입력되어 있던 내용을 보여줍니다. 





내용을 수정 후..  수정 버튼을 선택해주면





해당 내용으로 변경된 것을 볼 수 있습니다. 




CustomAdapter.java

public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.CustomViewHolder>  {

    private ArrayList<Dictionary> mList;
    private Context mContext;


   // 1. 컨텍스트 메뉴를 사용하라면 RecyclerView.ViewHolder를 상속받은 클래스에서 

    // OnCreateContextMenuListener 리스너를 구현해야 합니다. 

    public class CustomViewHolder extends RecyclerView.ViewHolder 

                       implements View.OnCreateContextMenuListener {

        protected TextView mId;
        protected TextView mEnglish;
        protected TextView mKorean;


        public CustomViewHolder(View view) {
            super(view);

            this.mId = (TextView) view.findViewById(R.id.textview_recyclerview_id);
            this.mEnglish = (TextView) view.findViewById(R.id.textview_recyclerview_english);
            this.mKorean = (TextView) view.findViewById(R.id.textview_recyclerview_korean);

            view.setOnCreateContextMenuListener(this); //2. OnCreateContextMenuListener 리스너를 현재 클래스에서 구현한다고 설정해둡니다.
        }




        @Override
        public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {  // 3. 컨텍스트 메뉴를 생성하고 메뉴 항목 선택시 호출되는 리스너를 등록해줍니다. ID 1001, 1002로 어떤 메뉴를 선택했는지 리스너에서 구분하게 됩니다. 

            MenuItem Edit = menu.add(Menu.NONE, 1001, 1, "편집");
            MenuItem Delete = menu.add(Menu.NONE, 1002, 2, "삭제");
            Edit.setOnMenuItemClickListener(onEditMenu);
            Delete.setOnMenuItemClickListener(onEditMenu);

        }



        // 4. 컨텍스트 메뉴에서 항목 클릭시 동작을 설정합니다.
        private final MenuItem.OnMenuItemClickListener onEditMenu = new MenuItem.OnMenuItemClickListener() {



            @Override
            public boolean onMenuItemClick(MenuItem item) {


                switch (item.getItemId()) {
                    case 1001// 5. 편집 항목을 선택시 


                        AlertDialog.Builder builder = new AlertDialog.Builder(mContext);

                        // 다이얼로그를 보여주기 위해 edit_box.xml 파일을 사용합니다.

                        View view = LayoutInflater.from(mContext)
                                .inflate(R.layout.edit_box, null, false);
                        builder.setView(view);
                        final Button ButtonSubmit = (Button) view.findViewById(R.id.button_dialog_submit);
                        final EditText editTextID = (EditText) view.findViewById(R.id.edittext_dialog_id);
                        final EditText editTextEnglish = (EditText) view.findViewById(R.id.edittext_dialog_endlish);
                        final EditText editTextKorean = (EditText) view.findViewById(R.id.edittext_dialog_korean);


                        // 6. 해당 줄에 입력되어 있던 데이터를 불러와서 다이얼로그에 보여줍니다.
                        editTextID.setText(mList.get(getAdapterPosition()).getId());
                        editTextEnglish.setText(mList.get(getAdapterPosition()).getEnglish());
                        editTextKorean.setText(mList.get(getAdapterPosition()).getKorean());


                        final AlertDialog dialog = builder.create();
                        ButtonSubmit.setOnClickListener(new View.OnClickListener() {


                            // 7. 수정 버튼을 클릭하면 현재 UI에 입력되어 있는 내용으로 

                            public void onClick(View v) {
                                String strID = editTextID.getText().toString();
                                String strEnglish = editTextEnglish.getText().toString();
                                String strKorean = editTextKorean.getText().toString();

                                Dictionary dict = new Dictionary(strID, strEnglish, strKorean );

                                // 8. ListArray에 있는 데이터를 변경하고
                                mList.set(getAdapterPosition(), dict);


                                // 9. 어댑터에서 RecyclerView에 반영하도록 합니다. 

                                 notifyItemChanged(getAdapterPosition());

                                dialog.dismiss();
                            }
                        });

                        dialog.show();

                        break;

                    case 1002:

                        mList.remove(getAdapterPosition());
                        notifyItemRemoved(getAdapterPosition());
                        notifyItemRangeChanged(getAdapterPosition(), mList.size());

                        break;

                }
                return true;
            }
        };


    }





3. 데이터 삭제


다시 원하는 줄에서 길게 눌러 컨텍스트 메뉴가 보이게 한 후.. 삭제를 선택해주면 





해당 줄이 삭제됩니다. 




CustomAdapter.java


public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.CustomViewHolder>  {

    private ArrayList<Dictionary> mList;
    private Context mContext;


   // 1. 컨텍스트 메뉴를 사용하라면 RecyclerView.ViewHolder를 상속받은 클래스에서 

    // OnCreateContextMenuListener 리스너를 구현해야 합니다. 

    public class CustomViewHolder extends RecyclerView.ViewHolder 

                       implements View.OnCreateContextMenuListener {

        protected TextView mId;
        protected TextView mEnglish;
        protected TextView mKorean;


        public CustomViewHolder(View view) {
            super(view);

            this.mId = (TextView) view.findViewById(R.id.textview_recyclerview_id);
            this.mEnglish = (TextView) view.findViewById(R.id.textview_recyclerview_english);
            this.mKorean = (TextView) view.findViewById(R.id.textview_recyclerview_korean);

            view.setOnCreateContextMenuListener(this); //2. OnCreateContextMenuListener 리스너를 현재 클래스에서 구현한다고 설정해둡니다.
        }




        @Override
        public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {  // 3. 컨텍스트 메뉴를 생성하고 메뉴 항목 선택시 호출되는 리스너를 등록해줍니다. ID 1001, 1002로 어떤 메뉴를 선택했는지 리스너에서 구분하게 됩니다. 

            MenuItem Edit = menu.add(Menu.NONE, 1001, 1, "편집");
            MenuItem Delete = menu.add(Menu.NONE, 1002, 2, "삭제");
            Edit.setOnMenuItemClickListener(onEditMenu);
            Delete.setOnMenuItemClickListener(onEditMenu);

        }



        // 4. 컨텍스트 메뉴에서 항목 클릭시 동작을 설정합니다.
        private final MenuItem.OnMenuItemClickListener onEditMenu = new MenuItem.OnMenuItemClickListener() {



            @Override
            public boolean onMenuItemClick(MenuItem item) {


                switch (item.getItemId()) {
                    case 1001:  


                     . . . . . . . . . . . . . . . . .


                        break;

                    case 1002// 5. 삭제 항목을 선택시 


                        // 6. ArratList에서 해당 데이터를 삭제하고 

                        mList.remove(getAdapterPosition());



                        // 7. 어댑터에서 RecyclerView에 반영하도록 합니다.
                        notifyItemRemoved(getAdapterPosition());
                        notifyItemRangeChanged(getAdapterPosition(), mList.size());

                        break;

                }
                return true;
            }
        };


    }




4. 코드 수정


레이아웃 edit_box.xml을 추가합니다. 

다이얼로그에 보여줄 UI를 구성했습니다.






<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:padding="10dp"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <EditText
        android:id="@+id/edittext_dialog_id"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_margin="16dp"
        android:hint="ID를 입력하세요."
        android:inputType="text"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toTopOf="@id/edittext_dialog_endlish"/>

    <EditText
        android:id="@+id/edittext_dialog_endlish"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_margin="16dp"
        android:hint="영어 단어를 입력하세요."
        android:inputType="text"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@id/edittext_dialog_id"
        app:layout_constraintBottom_toTopOf="@id/edittext_dialog_korean"/>

    <EditText
        android:id="@+id/edittext_dialog_korean"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_margin="16dp"
        android:hint="뜻을 입력하세요."
        android:inputType="text"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@id/edittext_dialog_endlish"
        app:layout_constraintBottom_toTopOf="@id/button_dialog_submit"/>

    <Button
        android:id="@+id/button_dialog_submit"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_margin="16dp"
        android:text="수정"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/edittext_dialog_korean" />

</androidx.constraintlayout.widget.ConstraintLayout>



background_color.xml


<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
    <stroke android:width="0.3dp" android:color="#000000"/>  <!-- 스트로크 선 -->
</shape>





MainActivity.java에 다음 코드를 다음처럼 수정합니다.


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        RecyclerView mRecyclerView = (RecyclerView) findViewById(R.id.recyclerview_main_list);
        LinearLayoutManager mLinearLayoutManager = new LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(mLinearLayoutManager);

        mArrayList = new ArrayList<>();

        //mAdapter = new CustomAdapter( mArrayList);
        mAdapter = new CustomAdapter( this, mArrayList);


        mRecyclerView.setAdapter(mAdapter);



      Button buttonInsert = (Button)findViewById(R.id.button_main_insert);
        buttonInsert.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

//                count++;
//
//                // Dictionary 생성자를 사용하여 ArrayList에 삽입할 데이터를 만듭니다.
//                Dictionary data = new Dictionary(count+"","Apple" + count, "사과" + count);
//
//                //mArrayList.add(0, dict); //RecyclerView의 첫 줄에 삽입
//                mArrayList.add(data); // RecyclerView의 마지막 줄에 삽입
//
//                mAdapter.notifyDataSetChanged(); //변경된 데이터를 화면에 반영
                AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                View view = LayoutInflater.from(MainActivity.this)
                        .inflate(R.layout.edit_box, null, false);
                builder.setView(view);
                final Button ButtonSubmit = (Button) view.findViewById(R.id.button_dialog_submit);
                final EditText editTextID = (EditText) view.findViewById(R.id.edittext_dialog_id);
                final EditText editTextEnglish = (EditText) view.findViewById(R.id.edittext_dialog_endlish);
                final EditText editTextKorean = (EditText) view.findViewById(R.id.edittext_dialog_korean);

                ButtonSubmit.setText("삽입");


                final AlertDialog dialog = builder.create();
                ButtonSubmit.setOnClickListener(new View.OnClickListener() {
                    public void onClick(View v) {
                        String strID = editTextID.getText().toString();
                        String strEnglish = editTextEnglish.getText().toString();
                        String strKorean = editTextKorean.getText().toString();

                        Dictionary dict = new Dictionary(strID, strEnglish, strKorean );

                        mArrayList.add(0, dict); //첫 줄에 삽입
                        //mArrayList.add(dict); //마지막 줄에 삽입
                        mAdapter.notifyDataSetChanged(); //변경된 데이터를 화면에 반영

                        dialog.dismiss();
                    }
                });

                dialog.show();
            }
        });

    }




CustomAdapter.java를 다음처럼 수정합니다. 


public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.CustomViewHolder> {

    private ArrayList<Dictionary> mList;
    private Context mContext;


    public class CustomViewHolder extends RecyclerView.ViewHolder
            implements View.OnCreateContextMenuListener { // 1. 리스너 추가
       protected TextView id;
        protected TextView english;
        protected TextView korean;


        public CustomViewHolder(View view) {
            super(view);
            this.id = (TextView) view.findViewById(R.id.id_listitem);
            this.english = (TextView) view.findViewById(R.id.english_listitem);
            this.korean = (TextView) view.findViewById(R.id.korean_listitem);

            view.setOnCreateContextMenuListener(this); //2. 리스너 등록
        }



        @Override
        public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {  // 3. 메뉴 추가


            MenuItem Edit = menu.add(Menu.NONE, 1001, 1, "편집");
            MenuItem Delete = menu.add(Menu.NONE, 1002, 2, "삭제");
            Edit.setOnMenuItemClickListener(onEditMenu);
            Delete.setOnMenuItemClickListener(onEditMenu);

        }

        // 4. 캔텍스트 메뉴 클릭시 동작을 설정
        private final MenuItem.OnMenuItemClickListener onEditMenu = new MenuItem.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {


                switch (item.getItemId()) {
                    case 1001:

                        AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
                        View view = LayoutInflater.from(mContext)
                                .inflate(R.layout.edit_box, null, false);
                        builder.setView(view);
                        final Button ButtonSubmit = (Button) view.findViewById(R.id.button_dialog_submit);
                        final EditText editTextID = (EditText) view.findViewById(R.id.edittext_dialog_id);
                        final EditText editTextEnglish = (EditText) view.findViewById(R.id.edittext_dialog_endlish);
                        final EditText editTextKorean = (EditText) view.findViewById(R.id.edittext_dialog_korean);

                        editTextID.setText(mList.get(getAdapterPosition()).getId());
                        editTextEnglish.setText(mList.get(getAdapterPosition()).getEnglish());
                        editTextKorean.setText(mList.get(getAdapterPosition()).getKorean());

                        final AlertDialog dialog = builder.create();
                        ButtonSubmit.setOnClickListener(new View.OnClickListener() {
                            public void onClick(View v) {
                                String strID = editTextID.getText().toString();
                                String strEnglish = editTextEnglish.getText().toString();
                                String strKorean = editTextKorean.getText().toString();

                                Dictionary dict = new Dictionary(strID, strEnglish, strKorean );

                                mList.set(getAdapterPosition(), dict);
                                notifyItemChanged(getAdapterPosition());

                                dialog.dismiss();
                            }
                        });

                        dialog.show();

                        break;

                    case 1002:

                        mList.remove(getAdapterPosition());
                        notifyItemRemoved(getAdapterPosition());
                        notifyItemRangeChanged(getAdapterPosition(), mList.size());

                        break;

                }
                return true;
            }
        };
    }



//    public CustomAdapter(ArrayList<Dictionary> list) {
//        this.mList = list;
//    }

    public CustomAdapter(Context context, ArrayList<Dictionary> list) {
        mList = list;
        mContext = context;

    }


    @Override
    public CustomViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {




관련 포스트


Android RecyclerView 간단한 예제

https://webnautes.tistory.com/1214



Android RecyclerView 아이템 클릭 이벤트 구현

https://webnautes.tistory.com/1300



참고


https://gist.github.com/gauravat16/e8e03496a4056829e65dede3c236da28




포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
댓글로 알려주시면 빠른 시일내에 답변을 드리겠습니다.

여러분의 응원으로 좋은 컨텐츠가 만들어집니다.
지금 본 내용이 도움이 되었다면 유튜브 구독 부탁드립니다. 감사합니다 : )

유튜브 구독하기

  1. 이전 댓글 더보기
  2. name 2018.12.21 19:52

    전체적으로 English 영어 단어 철자가 틀려서 원하는대로 출력이 안되네요 english 부분이 endlish로 되어있는거도 있어요

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2018.12.21 19:55 신고

      실행해보고 올린건데 실수로 올린 부분이 있나보군요. 확인해보겠습니다. 감사합니다 : )

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2018.12.21 22:30 신고

      일부 UI 이름이 오타가 있는데 실행하는데에는 문제가 없습니다.

  3. yolo 2018.12.23 21:27

    위 예제에서 나아가서 텍스트만이 아닌 이미지도 추가하여 카톡 프로필 사진처럼 추가, 수정, 삭제 하고싶은데 어떻게 접근하여야할까요? 안드로이드 초보라 응용이 너무 어렵네요.. ㅠ 도움좀 주세요~

  4. 김호두마루 2018.12.30 15:47

    Dictionary 클래스 부분이 회식 글자로 보이고 회색 밑줄이 그어져 있는데 혹시 이유 알고 계신가요? 다른 메인클래스와 어댑터클래스에서도 Dictionary 부분이 빨간색으로 보이는데 이유를 찾지 못하고 있습니다ㅜㅜ

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2018.12.30 16:06 신고

      Dictionary 클래스파일의 패키지 이름이 다른 클래스와 일치하나 보세요..

  5. ㅇㅇ 2018.12.31 04:11

    java.lang.NullPointerException: Attempt to invoke virtual method 'void java.util.ArrayList.add(int, java.lang.Object)' on a null object reference
    널포인트 익셉션 뜨면서 안되는데 ㅎ;

  6. please 2019.01.08 23:24

    안녕하세요, 개발자를 목표로 공부를 하고있습니다.

    이번 게시글을 참고하여 RecyclerView가 잘 되는걸 확인하였는데,

    이걸 Taphost의 Fragment에 대입해서 사용하려고 하니

    mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); 이부분에서 문제가 발생하는거 같습니다.

    로그캣 확인해보니

    Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView.setLayoutManager(android.support.v7.widget.RecyclerView$LayoutManager)' on a null object reference
    at com.example.tptp2.ticket.DetailTicket.onCreate(DetailTicket.java:56)

    이런식으로 나옵니다. DetailTicket.java:56이 위에 언급한 부분입니다..

    계속 찾아보고있지만 해결을 못해서 도움주시면 감사하겠습니다 ㅠㅠ

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.01.09 12:38 신고

      다음 링크를 참고해보세요

      https://stackoverflow.com/a/35927529

  7. d 2019.02.01 10:29

    Attempt to invoke virtual method 'android.content.res.Resources$Theme android.content.Context.getTheme()' on a null object reference

    AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
    이 부분에서 자꾸 널값 참조라네요 ㅠ

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.02.01 12:43 신고

      포스팅 코드에서 혹시 수정한 부분이 있나요?



      포스팅의 코드에서는

      MainActivity에서 다음처럼 객체를 생성합니다.
      여기서 입력한 this를

      mAdapter = new CustomAdapter(this, mArrayList);




      언급한 부분에서 다음처럼 사용하게 됩니다.

      AlertDialog.Builder builder = new AlertDialog.Builder(mContext);


  8. d 2019.02.01 14:21

    감사합니다 ㅜㅜ 해결했어요!

  9. d 2019.02.01 18:01

    롱클릭이 아닌 버튼에 수정 삭제를 넣어서 쓰고싶은데
    메인에서 리스너를 달면 될까요?

  10. JudeSong 2019.03.05 01:23

    정말 많은 도움이 되었습니다!! 감사합니다!!

  11. 도와주세요.. 2019.04.04 21:31

    Adapter 클래스 부분에서
    getAdapterPosition() 이 전부 Cannot resolve method 'getAdapterPosition()' 에러때문에 빨간 글씨로 나오네요...

    왜이럴까요 ㅠ

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.04.04 23:04 신고

      CustomAdapter 클래스 첫부분이

      public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.CustomViewHolder>로 되어 있나요?

  12. ㅈㅇㅅ 2019.04.05 23:28

    Dictionary dict 이놈 뭐하는놈이죠?? 검색해도 잘 아난와서 모르겠네요

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.04.06 00:56 신고

      본 포스트는 아래 링크의 소스를 수정한 겁니다. 찾으시는 클래스도 아래 링크에 있습니다.

      http://webnautes.tistory.com/1214

  13. 다이얼로그 말고 액티비티 2019.04.07 21:33

    수정버튼 눌렀을 때 다이얼로그 말고 액티비티 창이 뜨는 식으로 만들었을 때
    넘어가는 액티비티에서 텍스트 그대로 가져오는 건 어떻게 해야하나요??

    editTextID.setText(mList.get(getAdapterPosition()).getId());
    editTextEnglish.setText(mList.get(getAdapterPosition()).getEnglish());
    editTextKorean.setText(mList.get(getAdapterPosition()).getKorean());

    비슷하게 하면 되겠지 싶었는데
    getAdapterPosition()을 정의할 수가 없네요..

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.04.07 21:41 신고

      getAdapterPosition()는 아래처럼 선언해야 사용할 수 있습니다. 어댑터에서만 사용가능하다고 보면됩니다.

      public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.CustomViewHolder>


      CustomAdapter 클래스의
      현재 case 1001: 부분에서

      다이얼로그 대신에 액티비티를 시작하면 될듯합니다.

    • mm 2019.08.24 12:40

      extends 문제 없는데도 안 되는 건 왜때문인가요?ㅠㅜㅠ

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.08.24 15:21 신고

      getAdapterPostion()는 RecyclerView.ViewHolder의 메소드입니다.

      RecyclerView.ViewHolder를 extend하면 되야 하는데 이상하군요..

  14. 미소천사타노스 2019.05.10 01:22

    잘보고 갑니다. 도움이 많이 되었어요!

  15. narisca 2019.08.06 16:07

    안녕하세요
    선생님 포스트가 항상 제일 많은 도움이 됩니다
    감사합니다!

    아이템을 클릭하고 편집 버튼을 눌렀을때
    다이얼로그창이 뜨고 그 내부에 있는 버튼을
    메인액티비티에서 제어할수있을까요?
    그 수정하는 값도 가져올수있는지 알고싶습니다.




    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.08.06 16:13 신고

      감사합니다.

      메인액티비티에서 값을 전달하여 다이얼로그를 띄우고 다이얼로그 종료시 값을 메인액티비티로 전달할 수 있습니다.

    • narisca 2019.08.06 16:19

      빠른 답변 감사합니다.!
      제가 액티비티쪽에 리스너를 달았는데
      이거는 그냥 짧은 클릭했을때 반응하는 리스너가되었어요..
      아무튼 여기다가 메뉴아이템리스너를 만들고 다이얼로그를 다루라는 말씀이신가요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.08.06 16:28 신고

      버튼이나 메뉴 클릭시 다이얼로그를 띄우면 될듯합니다

  16. 언제나개발 2019.08.08 15:27

    정말감사합니다 통 소스까지 다있어서 너무 편하고 이해도잘되고 좋네요 많은 도움됬습니다

  17. 초보초보 2019.08.20 23:07

    컨텍스트 메뉴로 편집 , 수정 아이템 누르고 다이얼로그창 말고 따로 만든 액티비티창을 불러와서 수정하고 싶은데요. 어떻게 해야 하나요? ㅠ_ㅠ

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.08.20 23:36 신고

      인덴트를 사용하여 다른 액티비티로 넘겨주면 됩니다.

      다음 포스트를 참고하세요..

      Android 예제 - 액티비티간 데이터 전달하는 방법
      https://webnautes.tistory.com/1012

  18. 빠이팅 2019.11.19 15:33

    데이터 삭제하는 부분을 그대로 복사해서 실행했더니 중간에 있는 데이터를 삭제시키면 엉뚱한 데이터가 삭제되고 그러네요 맨 끝에서부터 삭제시키면 차근차근 삭제가 잘 되더라구요ㅠ 어떻게 고쳐야하나요?ㅠㅠ

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.11.20 08:52 신고

      다시 확인해보니 잘 동작합니다.
      빠진 코드가 있나 다시 확인해보세요.

  19. UNKNOWN 2020.03.01 18:17

    허어어어얼 ㅜㅜㅜㅜ 우와아아아아아아 ㅜㅜㅜㅜㅜㅜ 가장 일반인에게 잘 와닿게 설명해주셨어요 ㅜㅜㅜㅜ
    진짜 일하는 시간 빼고 일주일 밤낮을 이것만 찾아다니면서 연구했는데 다 실패했거든요 ㅜㅜㅜㅜㅜㅜ
    사실 아직 적용 전이긴 한데 확실히 이해가 됐습니다 ㅜㅜㅜㅜ 감사합니다!!!!!

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.03.01 18:19 신고

      도움이 되어서 다행입니다~~! 댓글 남겨주셔서 감사합니다~~

  20. Favicon of https://saeatechnote.tistory.com BlogIcon 새아SaeA 2020.03.03 14:28 신고

    recyclerview 관련내용 정말 많이 찾아보고 적용해봐도 계속 오류났었는데 완전히 해결됐어요! 수정 삭제부분까지 정말 감사합니다 너무너무 유용해요!! 감사합니다 복받으세요 성공하세요 부자되세요 :)

  21. 새아 2020.03.10 15:00

    잘 되지 않는 부분이 있어 질문드려요. 데이터 추가할 때, mArrayList.add(0, dict) 를 하면 입력하는대로 문제없이 나오고, 먼저쓴 것이 아래로 내려가고 새로쓴 것이 맨 위에 위치해 있도록 추가가 되는데(상단<-5,4,3,2,1->하단), 새로 추가한 것이 아래로 추가되게 하고 싶어서(상단<-1,23,4,5->하단) mArrayList.add(dict);를 하면 순서가 바뀌지 않고, 입력은 잘 되는데 추가버튼을 누르면 맨처음 입력했던 글자가 반복되서 출력이 되요ㅜㅜ 어떤 문제 때문에 그런가요? 바쁘시겠지만 답변 부탁드립니다!

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.03.10 19:15 신고

      mAdapter.notifyItemInserted(0); 를 주석처리하고 아래 코드로 바꾸어 사용해보세요

      mAdapter.notifyDataSetChanged();

+ Recent posts