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 }\nRun Code Online (Sandbox Code Playgroud)\n
我对该教程也有同样的问题。我搜索了这个问题并最终在此链接中得到了答案。对我来说,第二个答案非常有效。我将上传仅连接教程代码和链接上的第二个答案代码的代码。
在适配器中
@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)