简体   繁体   English

Android-Recycler视图设置项无法滑动

[英]Android - Recycler view set item not swipeable

I am using a RecyclerView and ItemTouchHelper.SimpleCallback => onSwiped method. 我正在使用RecyclerViewItemTouchHelper.SimpleCallback => onSwiped方法。 Some of the items at the recycler view are in progress and i want to disable swipe on them. 回收者视图中的某些项目正在进行中,我想在其上禁用滑动。

How can i do it? 我该怎么做?

You can override getSwipeDirs() in your ItemTouchHelper.SimpleCallback . 您可以在ItemTouchHelper.SimpleCallback重写getSwipeDirs() Return 0 when you don't want an item to be swipe-able. 如果您不希望可滑动项目,则返回0。

The second parameter to this method is the ViewHolder for the item being swiped- you can add a simple flag to your ViewHolder to indicate whether or not it is swipe-able. 此方法的第二个参数是要滑动项目的ViewHolder-您可以在ViewHolder上添加一个简单标志,以指示该项目是否可滑动。

For example: 例如:

static class SwipeViewHolder extends RecyclerView.ViewHolder {
    public boolean isSwipeable;

    public SwipeViewHolder(View itemView) {
        super(itemView);
    }
}

And the callback: 和回调:

static class DragAndSwipeCallback extends ItemTouchHelper.SimpleCallback {

    public DragAndSwipeCallback(int dragDirs, int swipeDirs) {
        super(dragDirs, swipeDirs);
    }

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

    @Override
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
        // Remove item
    }

    @Override
    public int getSwipeDirs(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
        if (viewHolder instanceof SwipeViewHolder
                && ((SwipeViewHolder) viewHolder).isSwipeable) {
            return super.getSwipeDirs(recyclerView, viewHolder);
        } else {
            return 0;
        }
    }
}

In my case I noticed getSwipeDirs() wasn't being called, probably because I had set movementFlags as well. 就我而言,我注意到没有调用getSwipeDirs() ,可能是因为我也设置了motionFlags

I had to override getMovementFlags() as well, like so: 我也必须重写getMovementFlags() ,如下所示:

        @Override
        public int getMovementFlags(RecyclerView recyclerView,
                                    RecyclerView.ViewHolder viewHolder) {
            if (viewHolder instanceof SwipeViewHolder
                    && ((SwipeViewHolder) viewHolder).isSwipeable) {
                return makeMovementFlags(0, super.getSwipeDirs(recyclerView, viewHolder));
            } else {
                return makeMovementFlags(0, 0);
            }
        }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM