Android “回收器”视图中的句柄单击按钮

Android “回收器”视图中的句柄单击按钮,android,button,android-recyclerview,Android,Button,Android Recyclerview,我有一个带有OnItemTouchListener的recycler视图,该recycler的每一行都有一个带有onclick事件的按钮 我想在点击按钮事件后工作,但OnItemTouchListener工作 请帮忙。我的密码 public class RecyclerViewTouchListener implements RecyclerView.OnItemTouchListener { private GestureDetector gestureDetector; private

我有一个带有OnItemTouchListener的recycler视图,该recycler的每一行都有一个带有onclick事件的按钮

我想在点击按钮事件后工作,但OnItemTouchListener工作

请帮忙。我的密码

public class RecyclerViewTouchListener  implements RecyclerView.OnItemTouchListener {


private GestureDetector gestureDetector;
private ClickListener clickListener;

public RecyclerViewTouchListener(Context context, final RecyclerView recyclerView, final ClickListener clickListener) {
    this.clickListener=clickListener;
    gestureDetector=new GestureDetector(new GestureDetector.SimpleOnGestureListener(){

        @SuppressWarnings("deprecation")
        @Override
        public boolean onSingleTapUp(MotionEvent e) {
            View child = recyclerView.findChildViewUnder(e.getX(), e.getY());
            if (child!=null && clickListener!=null){
                clickListener.OnClick(child,recyclerView.getChildPosition(child));
            }
            return true;
        }
    });
}

@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
    View child = rv.findChildViewUnder(e.getX(), e.getY());
    if (child != null && clickListener != null && gestureDetector.onTouchEvent(e)) {
        //noinspection deprecation
        clickListener.OnClick(child, rv.getChildPosition(child));
    }
    return false;
}

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

}

@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

}


public static interface ClickListener {
    void OnClick(View view,int position);

}
}

此代码位于viewholder中

deleteButton.setOnClickListener(new View.OnClickListener() {
        @Override public void onClick(View v) {
            callbacks.removePosition(getAdapterPosition());
        }
    });

对不起,我的直率,但首先删除此代码。然后,您需要创建自己的RecyclerAdapter,其中包含以下代码片段:

View.OnClickListener clickListener;

public void setOnItemClickListener(View.OnClickListener clickListener) {
    this.clickListener = clickListener;
}

@Override
public final void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    if (onClickListener != null) {
        holder.itemView.setOnClickListener(clickListener);
    }
}
然后,在您使用RecyclerView(活动、片段、自定义视图、视图的自定义包装器)的地方,您应该这样做:

List<SomeItem> someItems = getSomeItems();//Receive items for adapter from some place
MyRecyclerAdapter adapter = new MyRecyclerAdapter(someItems);
adapter.setOnItemClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            int position = orderListView.getChildAdapterPosition(v);
            SomeItem item = someItems.get(position);
            Log.v("CLICKED", "Clicking on item(" + position + ", " + item + ")");
        }
    });
recyclerView.setAdapter(adapter);
然后定义您自己的界面,以便在“删除”按钮上单击“定义”。例如:

public interface OnDeleteButtonItemClickListener {
    void onDeleteIsClick(View button, int position); 
}
然后将接口连接到适配器:

View.OnClickListener clickListener;
OnDeleteButtonItemClickListener deleteButtonListener;

public void setOnItemClickListener(View.OnClickListener clickListener) {
    this.clickListener = clickListener;
}

public void setDeleteButtonListener(OnDeleteButtonItemClickListener  deleteButtonListener) {
    this.deleteButtonListener= deleteButtonListener;
}

@Override
public final void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
    if (clickListener!= null) {
        holder.itemView.setOnClickListener(clickListener);
    }

    if (deleteButtonListener!= null) {
        MyHolder myHolder = (MyHolder) holder;
        myHolder.getDeleteButton().setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            deleteButtonListener.onDeleteIsClick(v, position)
        }
    });;
    }
}
然后更新您使用RecyclerView的位置:

List<SomeItem> someItems = getSomeItems();//Receive items for adapter from some place
MyRecyclerAdapter adapter = new MyRecyclerAdapter(someItems);
adapter.setOnItemClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            int position = orderListView.getChildAdapterPosition(v);
            SomeItem item = someItems.get(position);
            Log.v("CLICKED", "Clicking on item(" + position + ", " + item + ")");
        }
    });
adapter.setDeleteButtonListener(new OnDeleteButtonItemClickListener {
        @Override
        public void onDeleteIsClick(View button, int position) {
            SomeItem item = someItems.get(position);
            Log.v("CLICKED", "Clicking on delete button of item(" + position + ", " + item + ")");
        }
});
recyclerView.setAdapter(adapter);
List someItems=getSomeItems()//从某个地方接收适配器的项目
MyRecyclerAdapter=新的MyRecyclerAdapter(某些项目);
setOnItemClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
int position=orderListView.getChildAdapterPosition(v);
SomeItem=someItems.get(位置);
Log.v(“点击”,“点击项目”(+position+),“+item+”);
}
});
adapter.setDeleteButtonListener(新的OnDeleteButtonItemClickListener{
@凌驾
公共无效OnDeleteDisclick(查看按钮,int位置){
SomeItem=someItems.get(位置);
Log.v(“单击”,“单击项目的删除按钮”(“+position+”,“+item+”));
}
});
recyclerView.setAdapter(适配器);

很抱歉我的直率,但首先删除此代码。然后,您需要创建自己的RecyclerAdapter,其中包含以下代码片段:

View.OnClickListener clickListener;

public void setOnItemClickListener(View.OnClickListener clickListener) {
    this.clickListener = clickListener;
}

@Override
public final void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    if (onClickListener != null) {
        holder.itemView.setOnClickListener(clickListener);
    }
}
然后,在您使用RecyclerView(活动、片段、自定义视图、视图的自定义包装器)的地方,您应该这样做:

List<SomeItem> someItems = getSomeItems();//Receive items for adapter from some place
MyRecyclerAdapter adapter = new MyRecyclerAdapter(someItems);
adapter.setOnItemClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            int position = orderListView.getChildAdapterPosition(v);
            SomeItem item = someItems.get(position);
            Log.v("CLICKED", "Clicking on item(" + position + ", " + item + ")");
        }
    });
recyclerView.setAdapter(adapter);
然后定义您自己的界面,以便在“删除”按钮上单击“定义”。例如:

public interface OnDeleteButtonItemClickListener {
    void onDeleteIsClick(View button, int position); 
}
然后将接口连接到适配器:

View.OnClickListener clickListener;
OnDeleteButtonItemClickListener deleteButtonListener;

public void setOnItemClickListener(View.OnClickListener clickListener) {
    this.clickListener = clickListener;
}

public void setDeleteButtonListener(OnDeleteButtonItemClickListener  deleteButtonListener) {
    this.deleteButtonListener= deleteButtonListener;
}

@Override
public final void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
    if (clickListener!= null) {
        holder.itemView.setOnClickListener(clickListener);
    }

    if (deleteButtonListener!= null) {
        MyHolder myHolder = (MyHolder) holder;
        myHolder.getDeleteButton().setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            deleteButtonListener.onDeleteIsClick(v, position)
        }
    });;
    }
}
然后更新您使用RecyclerView的位置:

List<SomeItem> someItems = getSomeItems();//Receive items for adapter from some place
MyRecyclerAdapter adapter = new MyRecyclerAdapter(someItems);
adapter.setOnItemClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            int position = orderListView.getChildAdapterPosition(v);
            SomeItem item = someItems.get(position);
            Log.v("CLICKED", "Clicking on item(" + position + ", " + item + ")");
        }
    });
adapter.setDeleteButtonListener(new OnDeleteButtonItemClickListener {
        @Override
        public void onDeleteIsClick(View button, int position) {
            SomeItem item = someItems.get(position);
            Log.v("CLICKED", "Clicking on delete button of item(" + position + ", " + item + ")");
        }
});
recyclerView.setAdapter(adapter);
List someItems=getSomeItems()//从某个地方接收适配器的项目
MyRecyclerAdapter=新的MyRecyclerAdapter(某些项目);
setOnItemClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
int position=orderListView.getChildAdapterPosition(v);
SomeItem=someItems.get(位置);
Log.v(“点击”,“点击项目”(+position+),“+item+”);
}
});
adapter.setDeleteButtonListener(新的OnDeleteButtonItemClickListener{
@凌驾
公共无效OnDeleteDisclick(查看按钮,int位置){
SomeItem=someItems.get(位置);
Log.v(“单击”,“单击项目的删除按钮”(“+position+”,“+item+”));
}
});
recyclerView.setAdapter(适配器);

我想在单击按钮事件后工作,但不想在iTouchListener工作。什么?你到底有什么问题?“我想不出是什么,”蒂姆·卡斯特利金斯:对不起。我想在点击按钮后,点击方法运行。但是onclick method按钮不起作用,只运行onItemTouchListener。从
onInterceptTouchEvent
返回
true
,而不是false。。!!我想在点击按钮事件后工作,但OnItemTouchListener工作。什么?你到底有什么问题?“我想不出是什么,”蒂姆·卡斯特利金斯:对不起。我想在点击按钮后,点击方法运行。但是onclick method按钮不起作用,只运行onItemTouchListener。从
onInterceptTouchEvent
返回
true
,而不是false。。!!两年后问了一个问题,请原谅。你们提到:然后定义你们自己的界面,点击删除按钮。该接口将在何处定义?在活动中还是在适配器中?@kilokahn我认为这更多的是一种味道的问题。我更喜欢将它放在适配器中,因为它是处理该接口实例的地方。但是,例如,这个接口可以在几个不同的适配器中使用。如果是这样的话,我会有一个文件,里面有很多这样常见的点击界面,两年后我会问一个问题,所以请原谅我。你们提到:然后定义你们自己的界面,点击删除按钮。该接口将在何处定义?在活动中还是在适配器中?@kilokahn我认为这更多的是一种味道的问题。我更喜欢将它放在适配器中,因为它是处理该接口实例的地方。但是,例如,这个接口可以在几个不同的适配器中使用。在这种情况下,我会有一个文件,其中包含一堆这样的常见点击界面