【问题标题】:RecyclerView, different divider dependently on type of rowRecyclerView,不同的分隔符取决于行的类型
【发布时间】:2017-03-29 20:23:03
【问题描述】:

所以我有一个包含不同类型行的 ListView。我想禁用第一行的分隔线,并为第二行设置另一种样式的分隔线。

这样做的最佳做法是什么?

我目前正在通过以下方式添加分隔符:

    DividerItemDecoration dividerItemDecoration = new DividerItemDecoration(recyclerView.getContext(),DividerItemDecoration.VERTICAL);
    dividerItemDecoration.setDrawable(getDrawable(R.drawable.divider));
    recyclerView.addItemDecoration(dividerItemDecoration);

【问题讨论】:

    标签: android android-recyclerview


    【解决方案1】:

    我通过以下方式做到了这一点。

    注意:在我的解决方案中,分隔线是项目视图的一部分,您可以设置背景或画一条线,或添加底部边距并让空间显示背景从而创建分隔线等。我建议查看ItemDecoration api。我只是向您展示如何在 ItemDecoration 中确定您想要做什么。

    首先,在您的适配器中:

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        ...
        if (mData.get(postion) instanceof ObjectA)
            holder.itemView.setTag(R.id.noSpaceAfter, Boolean.TRUE);
        else
            holder.itemView.setTag(R.id.noSpaceAfter, Boolean.FALSE);
        ...
    }
    

    然后在你的RecyclerView 中声明一个ItemDecoration

    mRecyclerView.addItemDecoration(new MyDividerItemDecoration());
    

    最后,定义你的MyDividerItemDecorator

    public class MyDividerItemDecoration extends RecyclerView.ItemDecoration {
        public MyDividerItemDecoration () {
        }
    
        @Override
        public void getItemOffsets(Rect outRect, View view, RecyclerView parent,
                                   RecyclerView.State state) {
            Boolean noSpace = (Boolean) view.getTag(R.id.noSpaceAfter);
            View v = view.findViewById(R.id.view_sep);
            if (v != null) {
                if (noSpace == null || !noSpace) {
                    v.setVisibility(View.VISIBLE);
                } else {
                    v.setVisibility(View.INVISIBLE);
                }
            }
        }
    }
    

    考虑到这一点,您可以复制DividerItemDecoration 的源代码,然后在它的drawVertical 方法中,当您在循环中获取视图时,检查R.id.noSpaceAfter 是真还是假并跳过绘图相应地。

    【讨论】:

      【解决方案2】:

      尝试在布局底部添加行 xml 文件并定义所需的 layout_height 并设置 layout_width="match_parent" 并在您想要的特定索引处隐藏视图

      例如-

      `<View   
         android:id="@+id/view_divider"    
          android:layout_width="match_parent"    
          android:layout_height="@dimen/one"   
          android:background="@color/grey_divider_color"/>`
      

      【讨论】:

      • 谢谢,它可以作为快速解决方案,但我更喜欢更强大的解决方案。
      【解决方案3】:

      @Ali 我喜欢你的解决方案。但是,您的代码需要布局中的分隔符。我通过隐藏常规分隔线解决了它。无论如何,谢谢你的提示。这是我的课:

      public class DividerItemDecoration extends RecyclerView.ItemDecoration {
      
      private static final int[] ATTRS = new int[]{android.R.attr.listDivider};
      
      private Drawable divider;
      
      /**
       * Default divider will be used
       */
      public DividerItemDecoration(Context context) {
          final TypedArray styledAttributes = context.obtainStyledAttributes(ATTRS);
          divider = styledAttributes.getDrawable(0);
          styledAttributes.recycle();
      }
      
      /**
       * Custom divider will be used
       */
      public DividerItemDecoration(Context context, int resId) {
          divider = ContextCompat.getDrawable(context, resId);
      }
      
      @Override
      public void onDraw(Canvas canvas, RecyclerView parent, RecyclerView.State state) {
          int left = parent.getPaddingLeft();
          int right = parent.getWidth() - parent.getPaddingRight();
      
          int childCount = parent.getChildCount();
          for (int i = 0; i < childCount; i++) {
              View row = parent.getChildAt(i);
              Boolean noDivider = (Boolean) row.getTag(R.id.noSpaceAfter);
      
              if (noDivider == null || !noDivider) {
                  drawDivider(canvas, row, left, right);
              }
          }
      }
      
      private void drawDivider(Canvas canvas, View row, int left, int right) {
          RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) row.getLayoutParams();
      
          int top = row.getBottom() + params.bottomMargin;
          int bottom = top + divider.getIntrinsicHeight();
      
          divider.setBounds(left, top, right, bottom);
          divider.draw(canvas);
      }
      

      }

      【讨论】:

      • 正如我所提到的,我可以向您展示如何在 ItemDecoration 中确定您需要做什么,我什至在底部提到了您采用的确切方法。如果对您有帮助,请采纳为正确答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多