RecyclerView拖动第一个项目时,它跳到底部

Mis*_*pov 7 android scroll drag android-recyclerview

我正在使用 ItemTouchHelper 在 RecyclerView 中使用 \xe2\x80\x9cdrag & drop\xe2\x80\x9d 和 \xe2\x80\x9cswipe-to-dismiss\xe2\x80\x9d 。没有任何库,根据本教程。它工作正常。\n但是当 RecyclerView 中有滚动时就会出现问题。当我开始向下拖动第一个项目时,第一个第二个元素交换位置,RecyclerView 向上滚动,第一个元素(我拖动的)出现在最后一个元素之前的底部(由于 RecyclerView 滚动而发生许多滑动)。它发生得非常快,所以我无法将第一个元素放在我想要的任何地方。

\n\n

请注意,它仅发生在第一个元素上,也仅在向下拖动时发生。

\n\n

我认为发生这种情况是因为当第二个元素转到位置 1 时,第三个元素转到第二个位置并且也与第一个元素一起滑动,与其他元素相同,它们都与第一个元素一起滑动。我怎样才能解决这个问题。

\n\n

这就是当第一个项目与第二个项目改变位置时所称的情况(以及项目交换位置时的任何拖动)。一次交换后,一项就完成了:

\n\n
    @Override\n    public void onItemMove(int fromPosition, int toPosition) {\n        if (fromPosition < toPosition) {\n            for (int i = fromPosition; i < toPosition; i++) {\n                Collections.swap(categories, i, i + 1);\n            }\n        } else {\n            for (int i = fromPosition; i > toPosition; i--) {\n                Collections.swap(categories, i, i - 1);\n            }\n        }\n\n        notifyItemMoved(fromPosition, toPosition);\n    }\n
Run Code Online (Sandbox Code Playgroud)\n

for*_*son 3

我对该教程也有同样的问题。我搜索了这个问题并最终在此链接中得到了答案。对我来说,第二个答案非常有效。我将上传仅连接教程代码和链接上的第二个答案代码的代码。

在适配器中

    @Override
    public void onItemMove(int fromPosition, int toPosition) {
        if (fromPosition < toPosition) {
            for (int i = fromPosition; i < toPosition; i++) {
                Collections.swap(categories, i, i + 1);
            }
        } else {
            for (int i = fromPosition; i > toPosition; i--) {
                Collections.swap(categories, i, i - 1);
            }
        }

        // AdapterInteractionListener
        mListener.maintainRecyclerViewPosition(fromPosition, toPosition);
    }
Run Code Online (Sandbox Code Playgroud)

在活动/片段中

    LinearLayoutManager layoutManager = (LinearLayoutManager) mRecyclerView.getLayoutManager();
    int firstPos = layoutManager.findFirstCompletelyVisibleItemPosition();
    int offsetTop = 0;
    if(firstPos >= 0){
      View firstView = layoutManager.findViewByPosition(firstPos);
      offsetTop = layoutManager.getDecoratedTop(firstView) - layoutManager.getTopDecorationHeight(firstView);
    }

    mItemAdapter.notifyItemMoved(fromPosition, toPosition);
    if(firstPos >= 0) {
      layoutManager.scrollToPositionWithOffset(firstPos, offsetTop);
    }
Run Code Online (Sandbox Code Playgroud)