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

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) {

            }
        }));

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐