安卓自定义recycleview的item监听事件

文章介绍了如何在Android中为RecyclerView实现自定义的点击和长按事件监听。通过创建一个RecyclerItemClickListener类,实现RecyclerView.OnItemTouchListener接口,结合GestureDetector处理单击和长按操作。此外,还展示了如何在Adapter中绑定数据,并在MainActivity中应用监听事件。
摘要由CSDN通过智能技术生成

找了许多方案,只有这个可以解决我的问题

1.需要自定义一个RecyclerItemClickListener 并实现RecyclerView.OnItemTouchListener

package com.example.dbsqlite.adapter;

import android.content.Context;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;

import androidx.recyclerview.widget.RecyclerView;
//自定义监听事件 需要实现RecyclerView.OnItemTouchListener
public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
    GestureDetector mGestureDetector;
    private View childView;
    private RecyclerView touchView;

    public RecyclerItemClickListener(Context context, RecyclerItemClickListener.OnItemClickListener mListener) {
        mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
            @Override
            public boolean onSingleTapUp(MotionEvent ev) {
                if (childView != null && mListener != null) {
                    mListener.onItemClick(childView, touchView.getChildPosition(childView));
                }
                return true;
            }

            @Override
            public void onLongPress(MotionEvent ev) {
                if (childView != null && mListener != null) {
                    mListener.onLongClick(childView, touchView.getChildPosition(childView));
                }
            }
        });
    }

    public interface OnItemClickListener {
        void onItemClick(View view, int position);

        void onLongClick(View view, int posotion);
    }

    @Override
    public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
        mGestureDetector.onTouchEvent(e);
        childView = rv.findChildViewUnder(e.getX(), e.getY());
        touchView = rv;
        return false;
    }

    @Override
    public void onTouchEvent(RecyclerView rv, MotionEvent e) {

    }

    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

    }
}

2.自定义的Adapater 这是我用之前写的FruitAdapter改的

package com.example.dbsqlite.adapter;


import android.content.Context;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;


import androidx.annotation.NonNull;

import androidx.recyclerview.widget.RecyclerView;


import com.example.dbsqlite.R;

import com.example.dbsqlite.entity.BookModel;

import java.util.List;

public class BookModelAdapter extends RecyclerView.Adapter<BookModelAdapter.BookModelViewHolder> {


    private Context context;

    private List<BookModel> bookModelList;


    public BookModelAdapter(Context context, List<BookModel> bookModelList) {
        this.context = context;
        this.bookModelList = bookModelList;

    }

    @NonNull
    @Override
    public BookModelViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        //1.创造FruitViewHolder  放入子项目的布局
        View view = LayoutInflater.from(context).inflate(R.layout.item_book, parent, false);
        BookModelViewHolder bookModelViewHolder = new BookModelViewHolder(view);
        System.out.println("onBindViewHolder");

        return bookModelViewHolder;
    }

    //4.绑定数据 给控件赋值
    @Override
    public void onBindViewHolder(@NonNull BookModelViewHolder holder, int position) {
        BookModel bookModel = bookModelList.get(position);
        //注意我们的 id 字段为 Integer 类型 这里setText需要的是字符串  需要强制类型转换 才能正常设置进去别在recycleview中显示出来
        holder.idText.setText(String.valueOf(bookModel.getId()));
        holder.titleText.setText(bookModel.getTitle());
        holder.authorText.setText(bookModel.getAuthor());

        // holder.itemView.setTag(position);

    }

    //3.获取到我们的子项目布局的个数
    @Override
    public int getItemCount() {
        return bookModelList == null ? 0 : bookModelList.size();
    }

    //FruitViewHolder为我们的子项目布局去寻找实例的  所以内部类里面的view 应该是我们的水果类的 子项目布局传进去
    //才能找到我们的水果名称 图片 等等

    //2.在这里拿出我们的view里面的东西拿出来
    class BookModelViewHolder extends RecyclerView.ViewHolder {

        TextView idText;
        TextView titleText;
        TextView authorText;



        public BookModelViewHolder(@NonNull View itemView) {//找到当前的item 获取控件
            super(itemView);
            idText = itemView.findViewById(R.id.bookId);
            titleText = itemView.findViewById(R.id.bookTitle);
            authorText = itemView.findViewById(R.id.bookAuthor);


        }
    }

}

3.MainActivity中需要这样做即可

  //recycleview本身没有对每一子项目的点击事件  这里自定义点击事件    点击或者长按 尝试了很多方法只有这个能解决问题
        recyclerView.addOnItemTouchListener(new RecyclerItemClickListener(this, new RecyclerItemClickListener.OnItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {
                Print(recyclerView, view, position);
            }

            @Override
            public void onLongClick(View view, int posotion) {

            }
        }));

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值