转载原文出处:https://blog.csdn.net/ambitionsd/article/details/81505248
RecyclerView可以实现更加好看的布局,但是对于item点击事件的实现却有些麻烦,这里讲的是我在看过各种资料和博客后个人觉得最好用的两种方法(其实说到底也只是一种方法),放在这里可以给大家学习也算是自己的一种复习
方法一:
1、首先在adapter类外定义一个OnRecyclerItemClickListener的接口
public interface OnRecyclerItemClickListener {
//RecyclerView的点击事件,将信息回调给view
void onItemClick(int Position, List
}
2、接下来就是绑定监听事件了,因为官方没有提供点击的监听,所以我们这个监听方法就不能绑定在recyclerview对象上,因此,我们将这个步骤转移到adapter中进行。
public class IntegralAdapter extends RecyclerView.Adapter
private List
//声明自定义的监听接口
private OnRecyclerItemClickListener monItemClickListener;
//提供set方法供Activity或Fragment调用
public void setRecyclerItemClickListener(OnRecyclerItemClickListener listener){
monItemClickListener=listener;
}
class ViewHolder extends RecyclerView.ViewHolder{
TextView integralContent;
TextView integralChange;
TextView integralTime;
public ViewHolder(View view){
super(view);
integralContent=view.findViewById(R.id.integral_content);
integralChange=view.findViewById(R.id.change_integral);
integralTime=view.findViewById(R.id.integral_time);
//将监听传递给自定义接口
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (monItemClickListener!=null){
monItemClickListener.onItemClick(getAdapterPosition(),mDataBeanList);
}
}
});
}
}
……
}
这里只提供监听事件的绑定方法,至于Adapter类中的其他方法,这里就不写了,相信大家都会。
其实方法一是我个人很喜欢的一个方法,这里在定义的接口中传入了具体的数据dataBeanList,方便信息的处理和回调,降低了代码的耦合性,可以把数据的处理放在一个单独的方法中,有更清楚的逻辑,而且在代码出错时更容易定位,这其实也是mvp模式的思想。
最后在Activity或Fragmen中的调用
adapter.setRecyclerItemClickListener(new OnRecyclerItemClickListener() {
@Override
public void onItemClick(int Position, List
//具体的操作逻辑
mIntegralPresenter.onItemClick(Position,dataBeanList);
}
});
方法二:
方法二是我最早使用的方法,是直接把接口定义在Adapter方法中的,具体代码如下
public class IntegralAdapter extends RecyclerView.Adapter
private List
//定义接口
public static interface OnItemClickListener {
void onItemClick(View view,int position);
}
//声明自定义的监听接口
private OnItemClickListener monItemClickListener=null;
//提供set方法
public void setonItemClickListener(OnItemClickListener listener){
this.monItemClickListener=listener;
}
static class ViewHolder extends RecyclerView.ViewHolder{
TextView integralContent;
TextView integralChange;
TextView integralTime;
public ViewHolder(View view){
super(view);
integralContent=view.findViewById(R.id.integral_content);
integralChange=view.findViewById(R.id.change_integral);
integralTime=view.findViewById(R.id.integral_time);
}
}
public IntegralAdapter(List
mIntegralList=integralList;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view= LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_integral,parent,false);
ViewHolder holder=new ViewHolder(view);
//绑定监听事件
view.setOnClickListener(this);
return holder;
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Integral integral=mIntegralList.get(position);
holder.integralContent.setText(integral.getContent());
if (integral.isType()==true){
holder.integralChange.setSelected(true);
holder.integralChange.setText("+"+integral.getChange());
}else {
holder.integralChange.setSelected(false);
holder.integralChange.setText("-"+integral.getChange());
}
holder.integralTime.setText(integral.getTime());
//将position保存在itemView的Tag中,以便点击时进行获取
holder.itemView.setTag(position);
}
@Override
public void onClick(View v) {
if (mIntegralList!=null){
//这里使用getTag方法获取position
monItemClickListener.onItemClick(v,(int)v.getTag());
}
}
@Override
public int getItemCount() {
return mIntegralList.size();
}
}
这里就不做详细讲述了,和上面基本一样
在Activity或Fragmen中的调用
adapter.setonItemClickListener(new OnItemClickListener() {
@Override
public void OnItemClick(View view, int postion) {
//具体操作逻辑
}
});
这个方法与上面的方法相比,最大的不同就是自定义的监听事件中没有传入具体的数据,如果需要对数据进行操作的话就只能在activity或fragment中进行,同时读取数据的也就自热而然由它们做了,这样是不利于代码的维护的,当然在学习的时候这样写是可以的,方便理清楚逻辑。
手机扫一扫
移动阅读更方便
你可能感兴趣的文章