CymChad / BaseRecyclerViewAdapterHelper

BRVAH:Powerful and flexible RecyclerAdapter
http://www.recyclerview.org/
MIT License
24.33k stars 5.16k forks source link

点击事件和长按拖动事件冲突; #1782

Closed keepgoodfeeling closed 6 years ago

keepgoodfeeling commented 6 years ago

item的子控件有点击事件时,长按子控件拖动事件失效。只有没有设置点击事件的view可以长按拖动;

item的子控件没有点击事件时,长按该item的子控件可以正常拖动。

AllenCoder commented 6 years ago

是否使用的是 adapter.setItemChildClickListener ,Demo里面的ItemClick有专门的详细使用方法,也可参考此链接 https://github.com/CymChad/BaseRecyclerViewAdapterHelper/wiki/Add-OnItemClickLister

adapter.setOnItemLongClickListener(new BaseQuickAdapter.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(BaseQuickAdapter adapter, View view, int position) {
                Log.d(TAG, "onItemLongClick: ");
                Toast.makeText(ItemClickActivity.this, "onItemLongClick" + position, Toast.LENGTH_SHORT).show();

                return false;
            }
        });
keepgoodfeeling commented 6 years ago

是用这种方法设置的,我改了demo中的ItemDrag and Swipe 类,也发现有同样的问题:有点击事件时,长按事件是失效的;

public class ItemDragAdapter extends BaseItemDraggableAdapter<String, BaseViewHolder> {
    public ItemDragAdapter(List data) {
        super(R.layout.item_draggable_view, data);
    }

    @Override
    protected void convert(BaseViewHolder helper, String item) {
        switch (helper.getLayoutPosition() %
                3) {
            case 0:
                helper.setImageResource(R.id.iv_head, R.mipmap.head_img0);
                break;
            case 1:
                helper.setImageResource(R.id.iv_head, R.mipmap.head_img1);
                break;
            case 2:
                helper.setImageResource(R.id.iv_head, R.mipmap.head_img2);
                break;
        }
        helper.setText(R.id.tv, item);
        helper.addOnClickListener(R.id.iv_head);
        helper.addOnClickListener(R.id.email);
        helper.addOnClickListener(R.id.iv);

    }
}
keepgoodfeeling commented 6 years ago

这是写的点击事件的实现:

mAdapter.setOnItemChildClickListener(new BaseQuickAdapter.OnItemChildClickListener() {
            @Override
            public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) {
                switch (view.getId()) {
                    case R.id.iv:
                        ToastUtils.showShortToast("点击了拖动图片了");

                        break;
                    case R.id.iv_head:
                        ToastUtils.showShortToast("点击了头像了");

                        break;
                    case R.id.email:
                        ToastUtils.showShortToast("点击了email了");

                        break;
                }
            }
        });
keepgoodfeeling commented 6 years ago

@AllenCoder 感谢回复,请指教一下.以前用的时候,功能简单,没有问题,这次的需求比较复杂:三种类型的item,在一个recyclerView中,要求可以长按拖动改变item的顺序;并且每个item中都有自己子view的多个点击事件,当设置点击事件后,长按拖动就失效了. 只能长按item没有设置点击事件的地方才会响应拖动事件。 非常感谢!

juziml commented 6 years ago

view onClick 和 onLongClick 是有时间判断的。我上次看远吗好像是 100ms 和 400ms 你可以看看swipeview 中是不是没有处理 onclick时间判断。

keepgoodfeeling commented 6 years ago

我自己写了个接口回调,解决了这个问题。但感觉不够优雅,使用框架的达不到需求;

       mDynamicAdapter.setOnLongClickListener(new DynamicAdapter.OnItemLongClickListener() {
            @Override
            public boolean OnLongClick(BaseViewHolder helper, int type) {
 //手动从adapter 的
//protected void convert(final BaseViewHolder helper, DynamicBean item) 
//实现中传参,调用api,解决了这个问题,但感觉不够优雅。
                mItemTouchHelper.startDrag(helper);
                return true;
            }
        });
keepgoodfeeling commented 6 years ago

@HarkBen 谢谢。