Android “回收器”视图中的句柄单击按钮
我有一个带有OnItemTouchListener的recycler视图,该recycler的每一行都有一个带有onclick事件的按钮 我想在点击按钮事件后工作,但OnItemTouchListener工作 请帮忙。我的密码Android “回收器”视图中的句柄单击按钮,android,button,android-recyclerview,Android,Button,Android Recyclerview,我有一个带有OnItemTouchListener的recycler视图,该recycler的每一行都有一个带有onclick事件的按钮 我想在点击按钮事件后工作,但OnItemTouchListener工作 请帮忙。我的密码 public class RecyclerViewTouchListener implements RecyclerView.OnItemTouchListener { private GestureDetector gestureDetector; private
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我认为这更多的是一种味道的问题。我更喜欢将它放在适配器中,因为它是处理该接口实例的地方。但是,例如,这个接口可以在几个不同的适配器中使用。在这种情况下,我会有一个文件,其中包含一堆这样的常见点击界面