我正在使用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);
}
我在该教程中遇到了同样的问题。我搜索了这个问题并最终在这个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);
}