ItemTouchHelper获取滑动方向

5

我需要根据滑动方向更改行项目的背景色,如果向右滑动,则将颜色更改为绿色,如果向左滑动,则将颜色更改为红色。

但是我发现很难获取滑动的方向。

这是我的代码。

public class SimpleItemTouchHelperCallback extends ItemTouchHelper.Callback 
{

private final ItemTouchHelperAdapter mAdapter;
public SimpleItemTouchHelperCallback(ItemTouchHelperAdapter mAdapter) {
    this.mAdapter = mAdapter;
}

@Override
public boolean isItemViewSwipeEnabled() {
    return true;
}

@Override
public boolean isLongPressDragEnabled() {
    return false;
}

@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
    return false;
}

@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
    final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
    final int swipeFlags = ItemTouchHelper.START |  ItemTouchHelper.END;
    return makeMovementFlags(dragFlags,swipeFlags);
}

@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
    if(direction == ItemTouchHelper.LEFT){
        Log.i("Swipe direction : ","Left");
    }
    else if (direction == ItemTouchHelper.RIGHT){
        Log.i("Swipe direction : ","Right");
    }
    mAdapter.onItemDismiss(viewHolder.getAdapterPosition());
}
}

我的日志中没有得到任何值。

请给出建议。


最好从ItemTouchHelper.SimpleCallback开始。 - pskink
请注意 START、END、LEFT 和 RIGHT 的区别 - 文档中提到:“如果您从 getMovementFlags(RecyclerView, ViewHolder) 方法返回相对方向(START、END),则此方法也将使用相对方向。否则,它将使用绝对方向。” - pskink
@pskink:非常感谢,这很有帮助。 - Venkatesh Kashyap
没问题,不客气。 - pskink
1个回答

8

正如 Ramees 所示,您可以使用ItemTouchHelper.SimpleCallbackonChildDraw回调函数在滑动过程中检测滑动方向,然后根据滑动方向使用此回调函数显示不同的项背景。当滑动完成时,onSwiped回调将检测滑动方向,然后您可以决定采取什么动作。

new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {

    @Override
    public void onChildDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView,
                            @NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY,
                            int actionState, boolean isCurrentlyActive) {

        // dX (float) is the amount of horizontal displacement caused by user's action.            
        // If the horizontal displacement is positive the item is being 
        // swiped to the RIGHT, if it is negative the item is being 
        // swiped to the LEFT.

        if(dX >0) {
            // RIGHT swipe   
            } else {
            // LEFT swipe
            }
    }

}).attachToRecyclerView(mRecyclerView);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接