10

我正在使用 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);
}
4

3 回答 3

5

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

这让我感到惊讶,因为我认为 onMove() 在下降后被调用。事实上,它对下降本身有影响。

于 2016-08-03T07:50:15.473 回答
4

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

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

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

于 2018-11-30T17:02:40.027 回答
0

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

viewBinding.recycler.setHasFixedSize(true)

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

由于这篇文章,我得到了这个解决方案。

于 2021-07-23T11:33:25.357 回答