找了许多方案,只有这个可以解决我的问题
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) {
}
}));