android - ItemTouchHelper.SimpleCallback onMove() 未触发
问题描述
我想在我的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()
以指定拖动方向并通知适配器移动的项目,就像我在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: ");
}
});
并调用onStartDrag(viewHolder)
Touchlistener 在视图中放置一个按钮,如下所示:
holder.itemBinding.dragBtn.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
mOnStartDragListener.onStartDrag(holder);
return false;
}
});
我敢肯定,有更有效的实现,一旦有人在这里发布,我会接受它。但是,这至少使它对我有用。
推荐阅读
- javascript - 该代码在桌面浏览器上时在移动设备中没有响应
- swift - CAGradientLayer iPhone SE 和其他人的结果不同
- mysql - 当日期匹配时,如何在 MySQL 中每组获得 1 条记录?
- doxygen - Doxygen:如何链接到 Doxygen 生成的 HTML 文件的用户定义锚点?
- javascript - 为什么我的图片只能在桌面上加载,而不能在移动设备上加载?
- python - 如何全局更改 Tkinter 主题?
- haskell - 没有由文字 '7.5' 产生的 (Fractional Integer) 实例
- ios - 为什么我的键盘在深色模式下采用这种背景颜色?
- angular-material - 提供的数据源与数组、Observable 或 DataSource 不匹配
- kotlin - Gradle 创建一个 kotlin 编译任务