ItemTouchHelper - 在第一条跳线之后强制下降

Posted

技术标签:

【中文标题】ItemTouchHelper - 在第一条跳线之后强制下降【英文标题】:ItemTouchHelper - The drop is forced after the first jumped line 【发布时间】:2016-12-04 14:38:28 【问题描述】:

我正在使用 ItemTouchHelper 和 ItemTouchHelper.SimpleCallback 来允许用户重新排序垂直列表 Recycler View。

拖放有效,但在第一条跳线后强制拖放,即使我的手指没有离开拖动的单元格。

请在 SimpleCallback 下面找到:

private void initSwipeAndDrap() 

    ItemTouchHelper.SimpleCallback simpleItemTouchCallback =
            new ItemTouchHelper.SimpleCallback(
                    ItemTouchHelper.UP | ItemTouchHelper.DOWN,
                    0) 

                //========== Swipe (Not used) ==============

                @Override
                public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) 
                


                //========== Drag ==============

                @Override
                public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) 

                    int fromPosition = viewHolder.getAdapterPosition();
                    int toPosition = target.getAdapterPosition();

                    Podcast podcast = rva.podcasts.remove(fromPosition);
                    rva.podcasts.add(toPosition, podcast);
                    act.dmo.updatePodcastsListPosition();
                    act.dmo.notifyDataSetChangedPodcast();

                    return true;
                

                @Override
                public boolean isLongPressDragEnabled() 
                    return false;
                


            ;

    itemTouchHelper = new ItemTouchHelper(simpleItemTouchCallback);
    itemTouchHelper.attachToRecyclerView(rv);

【问题讨论】:

【参考方案1】:

在 onMove() 方法中用 notifyItemMoved() 替换 notifyDataSetChanged() 解决了我的问题。

这让我大吃一惊,因为我认为 onMove() 是在放置后调用的。事实上,它对drop本身有影响。

【讨论】:

我遇到了这个问题。感谢您发布解决方案。 对于那些仍然没有工作的人:Why does my RecyclerView with ItemTouchHelper stop dragging after only one item, after overriding getItemViewType()?【参考方案2】:

对于那些在移动元素时遇到捕捉问题的人,如果您使用此覆盖

   @Override
    public int getItemViewType(int position) 
        return position;
    

只需从您的适配器中删除它,它就可以正常工作了

【讨论】:

【参考方案3】:

当我将回收器与视图分页器和约束布局一起使用时,我遇到了类似的问题。我尝试了这些响应,但唯一对我有帮助的是设置:

viewBinding.recycler.setHasFixedSize(true)

这使得将视图从回收站的一端拖动到另一端成为可能。没有它,每次拖动都会在滚动过程中中断。

感谢this 的帖子,我得到了这个解决方案。

【讨论】:

这不起作用

以上是关于ItemTouchHelper - 在第一条跳线之后强制下降的主要内容,如果未能解决你的问题,请参考以下文章

EventSource 在第一条消息后断开连接

Laravel 语言翻译未在第一条路线加载

在这个同步函数上,第二条语句在第一条语句之前运行

数据中心光纤跳线:可转换极性LC跳线和MPO跳线

纤亿通谈-单模和多模光纤跳线有哪些不同之处?

光纤跳线结构及分类介绍