Android 在RecyclerView中添加删除按钮

Android 在RecyclerView中添加删除按钮,android,android-recyclerview,android-imagebutton,Android,Android Recyclerview,Android Imagebutton,我正在尝试添加一个删除按钮,该按钮应根据项目在RecyclerView中的位置删除数据库中的项目。我正在努力解决这个问题。这是我的RecyclerView布局文件: <TextView android:id="@+id/layout_list_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentStar

我正在尝试添加一个删除按钮,该按钮应根据项目在
RecyclerView
中的位置删除数据库中的项目。我正在努力解决这个问题。这是我的
RecyclerView
布局文件:

<TextView
    android:id="@+id/layout_list_name"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentStart="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:textStyle="bold"
    android:textAppearance="?android:attr/textAppearanceLarge" />

<TextView
    android:id="@+id/layout_list_date"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignStart="@+id/layout_list_name"
    android:layout_alignLeft="@+id/layout_list_name"
    android:layout_below="@+id/layout_list_name" />

<ImageButton
    android:id="@+id/layout_list_delete"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true"
    android:contentDescription="Delete"
    android:src="@drawable/icon_layout_delete_layout_item" />
这是我的
RecyclerView
侦听器类:

private OnItemClickListener onItemClickListener;

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

GestureDetector gestureDetector;

public ListsDatabaseItemListener(Context context, OnItemClickListener listener) {
    onItemClickListener = listener;
    gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
        @Override
        public boolean onSingleTapUp(MotionEvent motionEvent) {
            return true;
        }
    });
}

@Override
public boolean onInterceptTouchEvent(RecyclerView recyclerView, MotionEvent motionEvent) {
    View view = recyclerView.findChildViewUnder(motionEvent.getX(), motionEvent.getY());

    if (view != null && onItemClickListener != null && gestureDetector.onTouchEvent(motionEvent)) {
        onItemClickListener.onItemClick(view, recyclerView.getChildLayoutPosition(view));

        return true;
    }
    return false;
}

@Override
public void onTouchEvent(RecyclerView recyclerView, MotionEvent motionEvent) {

}

@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

}
最后,这里是我的适配器类:

List<ListsDatabaseList> list;

public ListsDatabaseListAdapter(List<ListsDatabaseList> list) {
    this.list = list;
}

@Override
public ListsDatabaseListHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_list, parent, false);
    ListsDatabaseListHolder holder = new ListsDatabaseListHolder(view);

    return holder;
}

@Override
public void onBindViewHolder(ListsDatabaseListHolder holder, int position) {
    holder.name.setText(list.get(position).getName());
    holder.date.setText(list.get(position).getDate());
}

@Override
public int getItemCount() {
    return list.size();
}

public static class ListsDatabaseListHolder extends RecyclerView.ViewHolder {
    TextView name;
    TextView date;
    ImageButton delete;

    public ListsDatabaseListHolder(View view) {
        super(view);

        this.name = (TextView) view.findViewById(R.id.layout_list_name);
        this.date = (TextView) view.findViewById(R.id.layout_list_date);
        this.delete = (ImageButton) view.findViewById(R.id.layout_list_delete);
    }
}
列表;
公共列表DatabaseListAdapter(列表){
this.list=列表;
}
@凌驾
公共列表DatabaseListHolder onCreateViewHolder(视图组父级,int-viewType){
View=LayoutFlater.from(parent.getContext()).flate(R.layout.layout_list,parent,false);
ListsDatabaseListHolder=新ListsDatabaseListHolder(视图);
报税表持有人;
}
@凌驾
BindViewHolder上的公共无效(ListsDatabaseListHolder,int位置){
holder.name.setText(list.get(position.getName());
holder.date.setText(list.get(position.getDate());
}
@凌驾
public int getItemCount(){
返回list.size();
}
公共静态类ListDatabaseListHolder扩展了RecyclerView.ViewHolder{
文本视图名称;
文本查看日期;
图像按钮删除;
公共列表DatabaseListHolder(视图){
超级(视图);
this.name=(TextView)view.findViewById(R.id.layout\u list\u name);
this.date=(TextView)view.findViewById(R.id.layout\u list\u date);
this.delete=(ImageButton)view.findViewById(R.id.layout\u list\u delete);
}
}

关于如何实现这一点,您有什么建议吗?

您可以在
onBindViewHolder()方法中添加
ImageButton
单击listener:

@Override
public void onBindViewHolder(ListsDatabaseListHolder holder, final int position) {

    holder.name.setText(list.get(position).getName());
    holder.date.setText(list.get(position).getDate());

    holder.delete.setOnClickListener(new View.OnClickListener() {
          public void onClick(View v) {
              ListsDatabaseList theRemovedItem = list.get(position);
              // remove your item from data base
              list.remove(position);  // remove the item from list
              notifyItemRemoved(position); // notify the adapter about the removed item
          }
    });
}

很高兴您提供了这段代码以及所有内容,但您的问题是什么?不是在活动中添加删除侦听器,您可以在回收器适配器的onBindViewHolder中执行此操作。我确实在顶部问了我的问题,但显然没有说得太清楚。我试图在RecyclerView中的ImageButton中添加onClickListener。发布您的错误日志和完整活动,将适配器设置为RecyclerServiceWtry,以便对的onInterceptTouchEvent进行注释你的RecyclerView,我认为它消耗了整个事件。我试过了。它只会导致我的应用程序崩溃。还有其他方法吗?错误是当我注释掉onInterceptTouchEvent时,它的返回类型是布尔值。我需要保持返回错误;在这种情况下,处理程序或我的应用程序将无法编译。当我这样做时,会出现以下错误:致命异常:main java.lang.NullPointerExceptionThankyou Rami!我的应用现在可以用了。现在我将自己解决sqlite数据库部分;
@Override
public void onBindViewHolder(ListsDatabaseListHolder holder, final int position) {

    holder.name.setText(list.get(position).getName());
    holder.date.setText(list.get(position).getDate());

    holder.delete.setOnClickListener(new View.OnClickListener() {
          public void onClick(View v) {
              ListsDatabaseList theRemovedItem = list.get(position);
              // remove your item from data base
              list.remove(position);  // remove the item from list
              notifyItemRemoved(position); // notify the adapter about the removed item
          }
    });
}