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 해줍니다.
전체코드
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();
}
}
구현 모습
이상으로 recycler view 의 클릭이벤트를 주는 방법 2가지를 알아 보았습니다.
어려운 부분이나 헷갈리시는 부분있으시면 댓글 남겨주세요!