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

问题描述 投票:1回答:1

我正在使用ItemTouchHelper在RecyclerView中使用“拖放”和“轻扫 - 解除”。根据这个tutorial,没有任何图书馆。它完美地运作。但是当RecyclerView中有滚动时会出现问题。当我开始向下拖动第一个项目,第一个和第二个元素交换位置时,​​RecyclerView向上滚动并且第一个元素(我正在拖动)发生在最后一个元素之前的底部(由于RecyclerView滚动而发生许多滑动)。它发生得非常快,所以我不能把第一个元素放在我想要的任何地方。

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

我认为这是因为当第二个元素进入位置1时,第三个元素进入第二个位置并且还使用第一个元素进行滑动,并且与其他元素相同,它们都使用第一个元素进行滑动。我怎样才能解决这个问题。

当第一个项目用第二个项目更改位置时(以及项目交换位置时的任何拖动),这就是所谓的内容。一次交换后,一件物品完成:

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

        notifyItemMoved(fromPosition, toPosition);
    }
android scroll android-recyclerview drag
1个回答
0
投票

我在该教程中遇到了同样的问题。我搜索了这个问题并最终在这个link得到了答案。对我来说,第二个答案完美无缺。我将上传刚刚连接教程代码和链接上的第二个答案代码的代码。

在适配器中

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

在活动/片段中

    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);
    }
© www.soinside.com 2019 - 2024. All rights reserved.