반응형

 

RecyclerView 클릭 이벤트 구현하기

 

 

RecyclerView를 구현하고 나면 상황에 따라서 각 아이템을 클릭했을 때 여러가지 이벤트 처리를 해주어야 합니다. 

이때 ListView의 setOnItemClickListener() 메소드와 같은 기능을 직접 만들어서 사용해야 합니다. 

 

앞서 기본적인 RecyclerView를 구현한 상태에서 아이템 클릭시 해당 위치와 Data를 Toast로 띄우는 기능을 예제로 작성했습니다. 

아이템 클릭 이벤트를 위해 추가된 코드 영역은 주석으로 표시해 두었습니다.

 

RecyclerView 아이템 클릭 이벤트

 

 

기본적인 RecyclerView 사용법은 아래글을 참고하세요.

 

2021.12.29 - [IT 개발/Android] - [안드로이드] RecyclerView 사용법 (리사이클러뷰)

 

[안드로이드] RecyclerView 사용법 (리사이클러뷰)

RecyclerView 사용법 (리사이클러뷰) RecyclerView는 대량의 데이터를 효율적으로 화면에 나타내기 위해서, 각 아이템을 목록형태로 화면에 나타내는데 사용됩니다. ListView와 유사하나 아래와 같은 성

kadosholy.tistory.com

 

 

 

CustomAdapter.java 

 

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

    private ArrayList<String> localDataSet;

    //===== [Click 이벤트 구현을 위해 추가된 코드] ==========================
    // OnItemClickListener 인터페이스 선언
    public interface OnItemClickListener {
        void onItemClicked(int position, String data);
    }

    // OnItemClickListener 참조 변수 선언
    private OnItemClickListener itemClickListener;

    // OnItemClickListener 전달 메소드
    public void setOnItemClickListener (OnItemClickListener listener) {
        itemClickListener = listener;
    }
    //======================================================================


    //----- 뷰홀더 클래스 ---------------------------------------------------
    public static class ViewHolder extends RecyclerView.ViewHolder {
        private TextView textView;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            textView = itemView.findViewById(R.id.textView);
        }

        public TextView getTextView() {
            return textView;
        }

        public void setTextView(TextView textView) {
            this.textView = textView;
        }
    }
    //---------------------------------------------------------------------

    //----- 생성자 ---------------------------------------------------------
    // 생성자를 통해서 데이터를 전달받도록 함
    public CustomAdapter (ArrayList<String> dataSet) {
        localDataSet = dataSet;
    }
    //---------------------------------------------------------------------

    //----- RecyclerView Adapter 필수 구현 항목 ----------------------------
    @NonNull
    @Override   // ViewHolder 객체를 생성하여 리턴한다.
    public CustomAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.recyclerview_item, parent, false);

        CustomAdapter.ViewHolder viewHolder = new CustomAdapter.ViewHolder(view);

        //===== [Click 이벤트 구현을 위해 추가된 코드] =====================
        view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String data = "";
                int position = viewHolder.getAdapterPosition();
                if (position != RecyclerView.NO_POSITION) {
                    data = viewHolder.getTextView().getText().toString();
                }
                itemClickListener.onItemClicked(position, data);
            }
        });
        //==================================================================

        return viewHolder;
    }

    @Override   // ViewHolder안의 내용을 position에 해당되는 데이터로 교체한다.
    public void onBindViewHolder(@NonNull CustomAdapter.ViewHolder holder, int position) {
        String text = localDataSet.get(position);
        holder.textView.setText(text);
    }

    @Override   // 전체 데이터의 갯수를 리턴한다.
    public int getItemCount() {
        return localDataSet.size();
    }
    //-----------------------------------------------------------------------
}

 

 

 

MainActivity.java

 

public class MainActivity extends AppCompatActivity {

    int newDataNumber = 100;

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

        //----- 테스트를 위한 더미 데이터 생성 --------------------
        ArrayList<String> testDataSet = new ArrayList<>();
        for (int i = 0; i<20; i++) {
            testDataSet.add("TEST DATA" + i);
        }
        //--------------------------------------------------------

        RecyclerView recyclerView = findViewById(R.id.recyclerView);

        //--- LayoutManager는 아래 3가지중 하나를 선택하여 사용 ----
        // 1) LinearLayoutManager()
        // 2) GridLayoutManager()
        // 3) StaggeredGridLayoutManager()
        //---------------------------------------------------------
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager((Context) this);
        recyclerView.setLayoutManager(linearLayoutManager);  // LayoutManager 설정

        CustomAdapter customAdapter = new CustomAdapter(testDataSet);
        //===== [Click 이벤트 구현을 위해 추가된 코드] ==============
        customAdapter.setOnItemClickListener(new CustomAdapter.OnItemClickListener() {
            @Override
            public void onItemClicked(int position, String data) {

                Toast.makeText(getApplicationContext(), "Position:" + position + ", Data:" + data, Toast.LENGTH_SHORT).show();
            }
        });        
        //==========================================================
        recyclerView.setAdapter(customAdapter); // 어댑터 설정


        //----- 데이터 추가/삭제 버튼 -------------------------------
        Button buttonAddItem = findViewById(R.id.buttonAddItem);
        Button buttonDeleteItem = findViewById(R.id.buttonDeleteItem);

        buttonAddItem.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                testDataSet.add("NEW DATA " + newDataNumber++);
                customAdapter.notifyItemInserted(testDataSet.size());
            }
        });

        buttonDeleteItem.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                testDataSet.remove(testDataSet.size()-1);
                customAdapter.notifyDataSetChanged(); // 만능, 되도록 사용x
            }
        });
        //-----------------------------------------------------------
    }
}

 

 

2021.12.30 - [IT 개발/Android] - [안드로이드] RecyclerView 업데이트 및 갱신 방법

 

[안드로이드] RecyclerView 업데이트 및 갱신 방법

RecyclerView 업데이트 및 갱신 방법 RecyclerView의 아이템 내용이 변경되거나 아이템이 추가/이동/삭제 되었을 경우 RecyclerView에 반영하는 방법에 대해서 알아보고자 합니다. RecyclerView를 업데이트 및

kadosholy.tistory.com

 

 

반응형

+ Recent posts