gpt4 book ai didi

android - ItemTouchHelper.SimpleCallback onMove() 未被触发

转载 作者:行者123 更新时间:2023-12-04 08:47:48 25 4
gpt4 key购买 nike

我想在我的RecyclerView中实现拖放。正如我发现的那样,实现这一点的最佳方法是将 ItemTouchHelper 附加到 RecyclerView

onSwiped() 工作正常,但永远不会触发 onMove()

这是我的做法:

EditIngredientsRecyclerViewAdapter premixableIngredientsAdapter = new EditIngredientsRecyclerViewAdapter(this, typeOfComponents);
GridLayoutManager gridLayoutManager1 = new GridLayoutManager(getContext(), 1);
recyclerView.setAdapter(premixableIngredientsAdapter);
recyclerView.setLayoutManager(gridLayoutManager1);

ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT) {
@Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
Log.d(TAG, "onMove: ");
return false;
}

@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
Log.d(TAG, "onSwiped: ");
}
};

ItemTouchHelper touchHelper = new ItemTouchHelper(simpleItemTouchCallback);
touchHelper.attachToRecyclerView(recyclerView);

最佳答案

我忘记了两件事:

**1。将 SimpleCallback 更新为:

ItemTouchHelper.SimpleCallback simpleItemTouchCallback = new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT) {
@Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
// Notify Adapter of the moved item!
recyclerView.getAdapter().notifyItemMoved(viewHolder.getAdapterPosition(), target.getAdapterPosition());
return true;
}

@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
// No swipe action
}

@Override
public boolean isItemViewSwipeEnabled() {
// Disable swipe (dont override this method or return true, if you want to have swipe)
return false;
}

@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
// Set movement flags to specify the movement direction
// final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.RIGHT | ItemTouchHelper.LEFT; <-- for all directions
// In this case only up and down is allowed
final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
final int swipeFlags = 0;
return makeMovementFlags(dragFlags, swipeFlags);
}
};

特别重要的是覆盖getMovementFlags()来指定拖动的方向并通知适配器移动的Item,就像我在onMove()中所做的那样

<强>2。通过 itemTouchHelper.startDrag(viewHolderElement) 触发拖动:

我通过在 RecyclerViewAdapter 中创建一个小界面来做到这一点:

public interface OnStartDragListener {
void onStartDrag(RecyclerView.ViewHolder holder);
}

创建适配器时,像这样传入一个新的 OnStartDragListenerElement:

EditIngredientsRecyclerViewAdapter premixableIngredientsAdapter = new EditIngredientsRecyclerViewAdapter(this, typeOfComponents, new EditIngredientsRecyclerViewAdapter.OnStartDragListener() {
@Override
public void onStartDrag(RecyclerView.ViewHolder holder) {
touchHelper.startDrag(holder);
Log.d(TAG, "onStartDrag: ");
}
});

并在 Touchlistener 中调用 onStartDrag(viewHolder) 放置在 View 中的按钮上,如下所示:

holder.itemBinding.dragBtn.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
mOnStartDragListener.onStartDrag(holder);
return false;
}
});

我敢肯定,还有更有效的实现,一旦有人在这里发布一个,我就会接受。但是,这至少让它对我有用。

关于android - ItemTouchHelper.SimpleCallback onMove() 未被触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64222981/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com