【问题标题】:Handle Click Button in recycler view在回收站视图中处理单击按钮
【发布时间】:2016-06-30 12:00:49
【问题描述】:

我有带有 OnItemTouchListener 的回收器视图,并且此回收器的每一行都有一个带有 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());
        }
    });

【问题讨论】:

  • 我希望在单击按钮事件后工作,但 OnItemTouchListener 工作。 什么?
  • 您的问题到底是什么?我不知道它是什么。
  • @TimCastelijns 对不起。我想在点击按钮后,点击方法运行。但 onclick 方法按钮不起作用,只有 onItemTouchListener 运行。
  • onInterceptTouchEvent返回true而不是false..!!

标签: android button android-recyclerview


【解决方案1】:

对不起,我的直率,但首先删除此代码。然后你需要创建你自己的 RecyclerAdapter,它会有这样的 sn-p 代码:

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(Activity、Fragment、自定义 View、自定义 Wrapper for View)的地方,您应该这样做:

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

在您关于单击任何项​​目内的按钮的问题旁边。 定义您自己的 Holder,在您的项目中保留 View 组件的引用:

public static class MyHolder extends RecyclerView.ViewHolder {
    private final Button deleteButton;

    public MyHolder(View itemView) {
        super(itemView);
        deleteButton = (Button) itemView.findViewById(R.id.delete_button);
    }

    public Button getDeleteButton() {
        return deleteButton;
    }
}

然后定义您自己的界面来定义删除按钮的点击。例如:

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

【讨论】:

  • 两年后再问一个问题,请见谅。您提到:然后定义您自己的界面以定义单击删除按钮。这个接口在哪里定义?在 Activity 还是在 Adapter?
  • @kilokahn 我认为这更多的是品味问题。我更喜欢将它放在适配器中,因为它是发生该接口实例的工作的地方。但是例如,这个接口可以用在几个不同的适配器中。在那种情况下,我会有一个包含一堆此类常见点击界面的文件
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-16
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多