반응형



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. ㅈㅇㅅ 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

  3. 다이얼로그 말고 액티비티 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하면 되야 하는데 이상하군요..

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

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

  5. 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 신고

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

  6. 언제나개발 2019.08.08 15:27

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

  7. 초보초보 2019.08.20 23:07

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

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

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

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

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

  8. 빠이팅 2019.11.19 15:33

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

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

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

  9. UNKNOWN 2020.03.01 18:17

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

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

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

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

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

  11. 새아 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();

  12. Favicon of https://taekoon.tistory.com BlogIcon taekoon 2020.04.13 17:49 신고

    안녕하세요
    뒤늦게 안드로이드 공부를 하고 있습니다.
    질문이 있습니다.
    처음에 CustomAdapter.java에서 CustromViewHolder 부분에서 갑자기(?) R.id.textview_recyclerview_id 가 나오더라고요.
    제가 id값을 작성자님이랑 다르게하고 있지만 다 대응해서 기억하고 있었는데 처음보는게 나와서 전글들을 다시 다 봤는데도 어디서 나온건지 모르겠습니다.
    recyclerview는 mainActivity에서 사용하고있고 모든 xml의 textview를 봤는데도 안보이네요...

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.04.13 17:58 신고

      item_list.xml에 정의된 textview입니다. 편집하다가 코드가 뒤바뀐지도 모르고 포스팅을 했었나보네요^^;

  13. 안드로이드 만진지 2달째 2020.04.14 06:51

    안녕하세요
    초보중에 초보자입니다.
    한지는 얼마 안됐지만 혼자 작은 하나 어플을 만들어 보려고 하니 모르는 것이 많아 검색하여 이곳에 방문하게 되었습니다.
    제가 찾던 내용이 있어 이른 아침 부터 얼마나 기쁜지 모릅니다. 이렇게 글을 작성하여 주심으로써 저같은 초보자에게 힘이 되어주신 점 먼저 감사드립니다.
    제가 기본 이론이 적고 잘 모르기에 제가드리는 질문이 적절한지 의심스럽지만 여쭤봅니다

    fragment 안에서 recyclerView를 구현시켰습니다. 구현시킬때 임의의 데이터를 넣어 10개의 리스트를 띄우기 까지 성공했습니다
    그다음은 // + 버튼을 오른쪽 하단에 생성하고 -> + 버튼을 누르면 -> dialog를 띄우고 -> 상세정보 넣고 완료누르면 -> list 추가 //를 구현하고 싶습니다

    우선 궁금한점은 MainActivity.java에 있는 코드를 onCreateView 메소드안에 넣어 줘야 하는지 아니면 밖에 둬야 하는지 궁금합니다 .^^??

    • 안드로이드 만진지 2달째 2020.04.14 07:01

      제가 생각하기에는 list를 추가하기 위한 내용을 가져와야하니 안에 있어야한다고는 생각하고는 있습니다 ...

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.04.14 07:51 신고

      맞습니다. 버튼 클릭시 실행해야 하는 코드니깐요

    • 안드로이드 만진지 2달째2020.04.14 07:01 제가 생각하기에는 li.. 2020.04.15 13:29

      감사합니다
      좋은 하루 되세요~ ^^

  14. 초보자 2020.05.18 14:32

    안녕하세요~
    CumstomAdapter.java 코드부분에서
    @Override
    public boolean onMenuItemClick(MenuItem item) {
    switch (item.getItemId()) {
    case 1001: // 5. 편집 항목을 선택시
    AlertDialog.Builder builder = new AlertDialog.Builder(mContext); <---- 이부분에서 error가 납니다

    아마도 제 생각에 fragment에서 실행하다 보니 그런 것 같은데... 그래서 fragment에서 버튼 클릭시 list 추가 실행하는 다른 예제를 따라 했을 때
    AlertDialog.Builder builder = new AlertDialog.Builder(getContext()); 로 코드를 작성하여 list 추가하기는 성공하였습니다.
    하지만 여기서
    AlertDialog.Builder builder = new AlertDialog.Builder(getContext(mContext)); 로 실행하였을 때 에뮬은 돌아가지만 길게 눌러 편집하기하면은 에러가 납니다.
    어떻게 해야 하는지 도움 주시면 정말 감사드려요~~~

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.05.18 20:21 신고

      다음처럼 getActivity()를 사용해보세요.

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

    • 초보자 2020.05.19 10:13

      말씀하신대로 햇지만 안돼요ㅠ.ㅠ
      getActivity() 의 괄호 안에 빨간 밑줄이 . . .

    • 초보자 2020.05.20 10:39

      문제 해결 하였습니다. ^^ 제가 실수를 하여 오류가 난것 입니다.

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

      mContext = context;
      어댑터 부분에서 제가 이부분을 수정을 빼먹어서 편집시 실행 오류가 났어요 ㅠ_ㅠ 혹시나 싶어서 글을 남깁니다.

      항상 감사드립니다 ^^

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.05.20 11:00 신고

      다행입니다

  15. 수정삭제버튼만들어서 2020.05.20 02:31

    public boolean onMenuItemClick(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.walkmodify:
    Intent editintent = new Intent(WalkDetailActivity.this, walkEditActivity.class);
    startActivity(editintent);
    break;
    case R.id.walkdelete:
    //mList.remove
    break;
    }
    return false;
    }
    리사이클러뷰 리스트 클릭하면 상세페이지로 가서 위에 햄버거메뉴버튼에 수정 삭제가있는데
    case R.id.walkmodify: 이걸 실행하면 편집액티비티로 넘어갑니다. 여기서이제 데이터를 수정해서 db내용을 바꾸고싶은데 코드를 못짜겠어요 ...
    case R.id.walkdelete: 삭제버튼누르면 바로 삭제되게하고싶은데.
    가르쳐주실수있으신가요.

  16. php연동 2020.05.26 00:42

    디비에서는 안사라지고 편집안되네요 알고보니php도 안불러왔엇네요

    디비에 바뀐값넣을려면 어디부분에서 php url넣어야하나요

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.05.26 20:11 신고

      다음 카테고리에 있는 포스트를 참고하세요

      https://webnautes.tistory.com/category/Android/Android%20PHP%20MySQL%20%EC%98%88%EC%A0%9C

  17. Sean 2020.07.21 01:04

    안녕하세요 이 글을 자주 챙겨보는 한 학생입니다. 이번에 제가 한 프로젝트를 진행하고 있는데 이런 기능들이 필요해서 소스를 참고해서 사용해도 될까요? 만약 된다면 제가 출처를 남기도록 하겠습니다

  18. Sean 2020.07.21 15:56

    감사합니다.

  19. Sean 2020.07.24 23:11

    안녕하세요 궁금한 것이 있어 질문드립니다. 사용자가 입력한 데이터를 받고 그것을 Arraylist에 수정할 때 Dictionary를 사용하셨는데 저는 바로 Dictionary(text1, text2);와 같은 형식이 아닌 size 와 같은 성질을 정의하라고 합니다. 어떻게 해결할 수 있을까요?

  20. Sean 2020.07.24 23:17

    앞서 설명이 미흡했던 점 죄송합니다.
    제 코드에서는
    Dictionary dict = new Dictionary() {
    @Override
    public int size() {
    return 0;
    }

    @Override
    public boolean isEmpty() {
    return false;
    }

    @Override
    public Enumeration keys() {
    return null;
    }

    @Override
    public Enumeration elements() {
    return null;
    }

    @Override
    public Object get(Object o) {
    return null;
    }

    @Override
    public Object put(Object o, Object o2) {
    return null;
    }

    @Override
    public Object remove(Object o) {
    return null;
    }
    };
    }
    라고해야지만 오류가 뜨지 않습니다 여가서 해결할 수 있는 방법이 있나요?
    감사합니다

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.07.25 07:16 신고

      Dictionary 타입 멤버변수를 포함하는 커스텀 클래스를 만드는게 어떨까 싶네요

  21. 젭알....... 2020.08.28 01:47

    PersonalData dict = new PersonalData(strID, strEnglish, strKorean); <- 여기서 strID, strEnglish, strKorean 이 부분이 에러가 뜨는데 이유를 알수있을까요ㅠㅠ

    다른 페이지에 있는 mysql과 함께 코딩에 추가하려 합니다.
    PersonalData personalData = new PersonalData();이 부분에도 에러가 뜹니다ㅜㅜ
    둘이 같이 쓰면 안되는건가용..

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.08.28 07:20 신고

      다음 글을 참고하세요

      https://m.blog.naver.com/PostView.nhn?blogId=heartflow89&logNo=220956516175&proxyReferer=https:%2F%2Fwww.google.com%2F

+ Recent posts