如何设置itemTouchHelper选择性滑动?

时间:2018-11-10 14:37:52

标签: android android-recyclerview swipe recycler-adapter itemtouchhelper

所以我已经在recyclerview rv上实现了这个itemtouchhelper.simple回调。

现在在此rv中,根据内容类型,我在布局中将2种设置为一行。

所以当我在rv上设置此touchhelper时,即使我不想这样做,也正在这两种布局上实现。我只想将该划动应用于该布局的一种。

ItemTouchHelper.SimpleCallback ith = new ItemTouchHelper.SimpleCallback(0,ItemTouchHelper.RIGHT) {
        @Override
        public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder viewHolder1) {
            return false;
        }

        @Override
        public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
            if(viewHolder.itemView.findViewById(R.id.messageholder_from) != null)
            {
                Log.d("texts", "onSwiped: "+viewHolder.itemView.findViewById(R.id.messageholder_from).findViewById(R.id.crfrom));
            }
            adapter.notifyDataSetChanged();
        }
    };
    new ItemTouchHelper(ith).attachToRecyclerView(rv);

如您所见,这段代码我只想在其中包含messageholder_from子项的行上执行滑动操作,否则,我不想执行滑动操作。

有什么方法可以删除此另一个子messageholder_to上的滑动动画和侦听器。

我的应用根据消息ID显示to_layout或from_layout。

感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

ItemTouchHelper.SimpleCallback内,重写getSwipeDirs()方法,并为要禁用滑动的任何行返回0。

@Override
public int getSwipeDirs(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
    if (viewHolder.itemView.findViewById(R.id.messageholder_from) == null) {
        return 0;
    }

    return super.getSwipeDirs(recyclerView, viewHolder);
}

根据确切的应用设置方式,可能有更好的方法来检测viewHolder是您要禁止刷卡的类型。例如,也许您可​​以拥有

if (viewHolder instanceof WrongKindOfViewHolder)

if (viewHolder.isNotSwipeable)

答案 1 :(得分:1)

int makeMovementFlags (int dragFlags,int swipeFlags)负责每一行的移动,滑动或拖动。

摘自文档:

  

创建运动标记的便捷方法。

     

例如,如果要拖放项目   垂直向左滑动即可解除,您可以调用此方法   使用:makeMovementFlags(UP | DOWN,LEFT);

实施getMovementFlags()方法,并返回makeMovementFlags(0, 0);,您不想为其添加滑动或拖动的行或视图。

示例代码:

@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {

    int dragFlags = 0;
    int swipeFlags = 0;

    if (recyclerView.getLayoutManager().getClass() == LinearLayoutManager.class ) {

        LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
        int orientation = linearLayoutManager.getOrientation();

        if (orientation == LinearLayoutManager.VERTICAL) {

            swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
            dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;


        }else {
            // horizontal
            dragFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
            // no swipe for horizontal layout
            swipeFlags = 0;
        }

    }

    if (viewHolder.getAdapterPosition() == 3) {
         // disable swipe feature for position 3 
        return makeMovementFlags(0, 0);
    }


    return makeMovementFlags(dragFlags, swipeFlags);
}