android开发:给RecyclerView的item添加点击事件

转载原文出处:https://blog.csdn.net/ambitionsd/article/details/81505248

RecyclerView可以实现更加好看的布局,但是对于item点击事件的实现却有些麻烦,这里讲的是我在看过各种资料和博客后个人觉得最好用的两种方法(其实说到底也只是一种方法),放在这里可以给大家学习也算是自己的一种复习

方法一:
1、首先在adapter类外定义一个OnRecyclerItemClickListener的接口

public interface OnRecyclerItemClickListener {
   //RecyclerView的点击事件,将信息回调给view
    void onItemClick(int Position, List<IntegralMenu.DataBean> dataBeanList);
}
 2、接下来就是绑定监听事件了,因为官方没有提供点击的监听,所以我们这个监听方法就不能绑定在recyclerview对象上,因此,我们将这个步骤转移到adapter中进行。

public class IntegralAdapter extends RecyclerView.Adapter<IntegralAdapter.ViewHolder> {
 
    private List<IntegralMenu.DataBean> mDataBeanList;
 
    //声明自定义的监听接口
    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<IntegralMenu.DataBean> dataBeanList) {
                //具体的操作逻辑
                mIntegralPresenter.onItemClick(Position,dataBeanList);
            }
        });
方法二:
方法二是我最早使用的方法,是直接把接口定义在Adapter方法中的,具体代码如下

public class IntegralAdapter extends RecyclerView.Adapter<IntegralAdapter.ViewHolder> implements View.OnClickListener {
 
    private List<Integral> mIntegralList;
    //定义接口
    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<Integral> integralList){
        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中进行,同时读取数据的也就自热而然由它们做了,这样是不利于代码的维护的,当然在学习的时候这样写是可以的,方便理清楚逻辑。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值