【问题标题】:how to set itemTouchHelper swipe selectively?如何选择性地设置 itemTouchHelper 滑动?
【发布时间】:2018-11-10 14:37:52
【问题描述】:

所以我在 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。

感谢您的任何帮助。

【问题讨论】:

    标签: android swipe android-recyclerview itemtouchhelper


    【解决方案1】:

    在您的 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)
    

    【讨论】:

      【解决方案2】:

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

      来自文档:

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

      例如,如果您想让您的项目被拖放 垂直向左滑动关闭,可以调用该方法 with: 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);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-01-22
        • 1970-01-01
        • 2017-02-07
        • 2019-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-24
        相关资源
        最近更新 更多