프로그래밍 언어/Java

[Android java] recyclerview setOnClickListener 두 가지 방법(2 Ways)

happy_life 2021. 11. 28. 15:18

recyclerview setOnClickListener 구현하기

 

안녕하세요 오늘은 recyclerview를 사용하는 와중에 clicklistener 가 없다는 것을 알게 되었습니다. 따라서 어떻게 하면 recyclerview에 클릭 이벤트를 줄 수 있을지 공부하였고

공부한 내용을 간단하게 요약해서 정리해드리겠습니다.

 

 

1.ViewHolder 생성자에 itemView에 setOnClickListener 달기

 

이런식으로 adpater class 에 있는 ViewHolder의 itemView에 클릭리스너를 달면 클릭이벤트를 구현할 수 있습니다.

 

하지만 보통 우리는 adapter가 아닌 리사이클러뷰를 구현하는 클래스에서 클릭이벤트를 발생시키고자 하는 경우가 많습니다. 따라서 이번에는 interface를 이용하여 Main클래스에서 클릭이벤트를 발생시키는 방법을 알아보겠습니다.

 

 

2.interface를 사용하여 Main액티비티에서 리사이클러뷰 클릭이벤트 구현하기

 

 

1)onListItemSelectedInterface 를 만들어 줍니다.

package com.example.recycleviewexample;

import android.view.View;


public interface onListItemSelectedInterface{
    void onItemSelected(View v, int position);
}

 

 

2)adapter에 인터페이스를 구현해줍니다. 

 

 

 

 

2)ViewHolder의 item에 전과 같이 setOnClickListener를 만듭니다. 이후 mListener인터페이스의 객체를 사용합니다.

 

전체코드

 

(밑의 findview에 있는 부분들은 무시하시면 됩니다) 

package com.example.recycleviewexample;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;
import java.util.List;

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



    private onListItemSelectedInterface mListener;

    Context mContext;

    public  MyRecyclerAdapter(Context context,onListItemSelectedInterface listener){
        this.mContext = context;
        this.mListener = listener;
    }
    private ArrayList<FriendItem> mFriendList;

    @NonNull
    @Override
    public MyRecyclerAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        Context context = parent.getContext();
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_recyclerview,parent,false);
        return new MyRecyclerAdapter.ViewHolder(view);
    }

    //!--데이터를 가져와서 뷰 홀더의 레이아웃을 완성한다.
    @Override
    public void onBindViewHolder(@NonNull MyRecyclerAdapter.ViewHolder holder, int position) {
        holder.onBind(mFriendList.get(position));
    }


    public void setFriendList(ArrayList<FriendItem>list){
        this.mFriendList = list;
        notifyDataSetChanged();
    }

    @Override
    public int getItemCount() {
        return mFriendList.size();
    }

    public class  ViewHolder extends RecyclerView.ViewHolder{

        //!--main 입력화면
         TextView capitalRecyclerView;
        TextView savingRecyclerView;
        TextView interestRecyclerView;
        TextView presentAgeRecyclerView;
        TextView retireAgeRecyclerView;

        //!-- main2 결과화면
        TextView principalRecyclerView;
        TextView beforeInterestRecyclerView;
        TextView interestTaxRecyclerView;
        TextView sumAfterTaxRecyclerView;
        TextView cashFlowRecyclerView;




        //!--ViewHolder 생성자
        public ViewHolder(@NonNull View itemView) {
            super(itemView);

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    mListener.onItemSelected(v,getAdapterPosition());
                    Log.d("test","position="+getAdapterPosition());
                }
            });
            //!--main1 입력화면
            capitalRecyclerView = itemView.findViewById(R.id.capitalRecyclerView);
            savingRecyclerView = itemView.findViewById(R.id.savingRecyclerView);
            interestRecyclerView = itemView.findViewById(R.id.interestRecyclerView);
            presentAgeRecyclerView = itemView.findViewById(R.id.presentAgeRecyclerView);
            retireAgeRecyclerView = itemView.findViewById(R.id.retireAgeRecyclerView);

            //!-- main2 결과화면
            principalRecyclerView = itemView.findViewById(R.id.principalRecyclerView);
            beforeInterestRecyclerView = itemView.findViewById(R.id.beforeInterestRecyclerView);
            interestTaxRecyclerView = itemView.findViewById(R.id.interestTaxRecyclerView);
            sumAfterTaxRecyclerView = itemView.findViewById(R.id.sumAfterTaxRecyclerView);
            cashFlowRecyclerView = itemView.findViewById(R.id.cashFlowRecyclerView);

        }

        void  onBind(FriendItem item){
            //!--main1 입력화면
            capitalRecyclerView.setText(item.getCapitalRecyclerView());
            savingRecyclerView.setText(item.getSavingRecyclerView());
            interestRecyclerView.setText(item.getInterestRecyclerView());
            presentAgeRecyclerView.setText(item.getPresentAgeRecyclerView());
            retireAgeRecyclerView.setText(item.getRetireAgeRecyclerView());

            //!-- main2 결과화면
            principalRecyclerView.setText(item.getPrincipalRecyclerView());
            beforeInterestRecyclerView.setText(item.getBeforeInterestRecyclerView());
            interestTaxRecyclerView.setText(item.getInterestTaxRecyclerView());
            sumAfterTaxRecyclerView.setText(item.getSumAfterTaxRecyclerView());
            cashFlowRecyclerView.setText(item.getCashFlowRecyclerView());
        }
    }


}

 

 

 

 

3)Main에서 인터페이스를 implement 해줍니다.

implement 부분
생성자를 통한 context 값 전달&nbsp;
인터페이스 구현부분&nbsp;

 

 

전체코드

package com.example.recycleviewexample;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity implements onListItemSelectedInterface {
    private RecyclerView  mRecyclerView;
    private MyRecyclerAdapter myRecyclerAdapter;
    private ArrayList<FriendItem> mFriendItems;

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

        mRecyclerView = findViewById(R.id.recyclerView);

        //!--initiate adapter
        myRecyclerAdapter = new MyRecyclerAdapter(this,this);

        //!--initiate recyclerview
        mRecyclerView.setAdapter(myRecyclerAdapter);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));

        mFriendItems = new ArrayList<>();
        for(int i =1;i<=15;i++){

                mFriendItems.add(new FriendItem(String.valueOf(i*100*11),String.valueOf(i*10),String.valueOf(i*10),String.valueOf(i+20),String.valueOf(i+40),String.valueOf(i*100),
                        String.valueOf(i*111),String.valueOf(i*25),String.valueOf(i*4),String.valueOf(i*3)));
        }
        myRecyclerAdapter.setFriendList(mFriendItems);
    }

    @Override
    public void onItemSelected(View v, int position) {
        Toast.makeText(getApplicationContext(),"position"+position,Toast.LENGTH_SHORT).show();
    }
}

 

구현 모습

position 1 클릭시
position 2 클릭시

 

이상으로 recycler view 의 클릭이벤트를 주는 방법 2가지를 알아 보았습니다.

어려운 부분이나 헷갈리시는 부분있으시면 댓글 남겨주세요!