我有一个项目,我需要以两种方式在一行上滑动以启动操作 . 向左滑动应从特定列表中删除有问题的项目(不将其从原始列表中删除,因此将其保留在recyclerview数据集中),向右滑动应将相关项目添加到另一个列表(同样不是原始列表) . 我实现了一个ItemTouchHelperAdapter和一个ItemTouchHelperCallback,我可以检测到左/右滑动,但视图会从屏幕上移开,我留下一个空白矩形 . 有任何想法吗?
public interface ItemTouchHelperAdapter {
/**
* Called when an item has been dismissed by a swipe.
*
* Implementations should call {@link RecyclerView.Adapter#notifyItemRemoved(int)} after
* adjusting the underlying data to reflect this removal.
*
* @param position The position of the item dismissed.
* @see RecyclerView#getAdapterPositionFor(RecyclerView.ViewHolder)
* @see RecyclerView.ViewHolder#getAdapterPosition()
*/
void onItemLeftSwipe(int position);
void onItemRightSwipe(int position);
}
公共类ItemTouchHelperCallback扩展ItemTouchHelper.Callback {
private final ItemTouchHelperAdapter mAdapter;
public ItemTouchHelperCallback(ItemTouchHelperAdapter adapter) {
mAdapter = adapter;
}
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
// int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
return makeMovementFlags(0, swipeFlags);
}
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
return false;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
if (direction == ItemTouchHelper.START)
mAdapter.onItemLeftSwipe(viewHolder.getAdapterPosition());
else if (direction == ItemTouchHelper.END)
mAdapter.onItemRightSwipe(viewHolder.getAdapterPosition());
else
System.out.println("direction: " + direction);
}
@Override
public boolean isLongPressDragEnabled() {
return false;
}
@Override
public boolean isItemViewSwipeEnabled() {
return true;
}
}
这是在我的适配器类中:
@Override
public void onItemLeftSwipe(int position) {
System.out.println("swiped left on " + mDataset.get(position).getName());
}
@Override
public void onItemRightSwipe(int position) {
System.out.println("swiped right on " + mDataset.get(position).getName());
}
3 回答
我不确定这是否是最好的解决方案和最有效的解决方案,但我刚刚删除了该项目并再次添加:
使用此类为适配器类中的每个项实现滑动侦听器 .
在适配器类中: