【问题标题】:How to add separator at particular position inside recyclerview?如何在recyclerview中的特定位置添加分隔符?
【发布时间】:2023-04-06 03:09:01
【问题描述】:

我有一个任务列表。为了显示我使用了 recyclerview 的列表。我的清单中有今天、明天和以后的第 3 项。我想在回收站视图中的第 3 个项目之后添加一个分隔符。我该怎么做?

适配器:

    public class ListAdapter extends RecyclerView.Adapter<ListAdapter.ItemViewHolder>{

    ArrayList<ListData> item;
    public static final int TYPE1=1;
    Context conext;


  public   ListAdapter(Context context, ArrayList<ListData> item) {
        this.conext=context;
        this.item=item;

    }
    public interface OnItemClickListener {
        void onItemClick(ListData listData);
    }
    @Override
    public int getItemCount() {
        return item.size();

    }
    public void remove(int position) {
        item.remove(position);
        notifyItemRemoved(position);
    }

   // @Override
   // public int getItemViewType(int position) {
       // return item.get(position).getExpenseType();// Assume that this return 1 0r 2
  //  }

    @Override
    public void onBindViewHolder(ItemViewHolder itemViewHolder,final int i) {

        itemViewHolder.listName.setText(item.get(i).getTitle());

    }

    @Override
    public ItemViewHolder onCreateViewHolder(ViewGroup viewGroup,int viewType) {

        View itemView = LayoutInflater.
                from(viewGroup.getContext()).
                inflate(R.layout.list_layout, viewGroup, false);
        return new ItemViewHolder(itemView,viewType);

    }


    public static class ItemViewHolder extends RecyclerView.ViewHolder {

        TextView listName;


        ItemViewHolder(View itemView, int viewType) {
            super(itemView);

            listName  = (TextView)itemView.findViewById(R.id.listData);

        }
    }
    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);
    }

}

任何人都可以帮助解决这个问题,我如何在列表中的 3 个项目之后放置分隔符? 谢谢。。

【问题讨论】:

标签: java android list android-recyclerview list-separator


【解决方案1】:

我有一个 recyclerview,其中包含节标题和每个节中可变数量的项目。该部分应该在整个屏幕上有一个行分隔符。并且项目之间必须有填充线。 所以,我的解决方案(在 kotlin 中)有两个视图,一个用于标题,一个用于项目。在getItemViewType中,根据item返回类型。

override fun getItemViewType(position: Int): Int {
    if(dataList[position] is HeaderItem)
        return Companion.TYPE_HEADER
    return Companion.TYPE_ITEM
   }

并在createviewholder中创建对应的viewholder,进行相应的绑定。

二手

parent.getChildViewHolder(parent.getChildAt(i))

决定项目分隔符的填充(或颜色或宽度)。

class ItemDivider(context: Context) : RecyclerView.ItemDecoration() {
    private var mDivider: Drawable
    private val mContext = context
companion object {
    private val ATTRS = intArrayOf(android.R.attr.listDivider)
}

init {
    val styledAttributes = context.obtainStyledAttributes(ATTRS)
    mDivider = styledAttributes.getDrawable(0)
    mDivider.setTint(ContextCompat.getColor(mContext, <color>))
    styledAttributes.recycle()
}

override fun onDraw(c: Canvas, parent: RecyclerView, state: RecyclerView.State?) {
    val right = parent.width - parent.paddingRight

    for (i in 0 until parent.childCount - 1) {
        val child = parent.getChildAt(i)
        val params = child.layoutParams as RecyclerView.LayoutParams
        val left = if (parent.getChildViewHolder(child) is HeaderViewHolder) {
            0
        } else {
            child.left + params.leftMargin + mContext.resources.getDimension(<padding_in_dp>).toInt()
        }
        val top = child.bottom + params.bottomMargin
        val bottom = top + mDivider.intrinsicHeight + <divider_height>

        mDivider.setBounds(left, top, right, bottom)
        mDivider.draw(c)
    }
}
}

记得用有效值替换颜色、内边距、分隔线高度。

希望对你有帮助!

【讨论】:

    【解决方案2】:

    一种解决方案是定义两种类型的 RecyclerView 行(一种用于普通行,一种用于分隔符) 另一种解决方案是您应该在custom RecycleView row xml 底部添加一个Separator View

    <View
        android:id="@+id/separatorView"
        android:layout_width="match_parent"
        android:layout_height="3dp"
        android:visible="gone"
        android:background="@android:color/darker_gray"/>
    

    然后在RecyclerView.AdapterbindViewHolder 中,将分隔符隐藏在普通行中并在分隔符行中可见

     @Override
        public void bindViewHolder(ViewHolder holder, int position) {
            if(position == separatorPosition){
               holder.separatorView.visible = View.VISIBLE;
            }else{
               holder.separatorView.visible = View.GONE;
            }
        }
    

    希望有帮助

    【讨论】:

    • 最简单的一个.. 谢谢..@Phan Văn Linh
    • 但是以后如果你的分隔符视图更复杂,我建议你应该使用解决方案1(定义2种RecyclerView)。快乐编码
    • 不,我只想要这种方式.. :-) 谢谢..@Phan Văn Linh
    • 我计划在适配器的第 0 个位置设置静态 relativelayout。但是我的 web 服务图像是从第 0 个位置加载的。所以我不能在第 0 个位置设置适配器中的静态 relativelayout。你能检查一下this.
    【解决方案3】:

    如果你知道你只打算在第一个三个项目中添加分隔符,那么你可以根据项目的positiononBindViewHolder内放置一个条件。

    ps:请不要忘记在 if 块之后添加一个 else 块

    【讨论】:

      【解决方案4】:

      您应该定义 2 种类型的 RecyclerView 行:

      ...YourRecyclerAdapter extends RecyclerView.Adapter<BaseViewHolder>
      
      public static final int COMMON = 1;
      public static final int SEPARATOR = 2;
      

      覆盖 getItemViewTypeAdapter 方法:

      @Override
      public int getItemViewType(int position) {
          if (position%10 == 0) //each 10 row is separator (change it!)
              return SEPARATOR;
          else return COMMON;
      }
      

      更改您的AdapteronCreateViewHolder 方法:

      @Override
      public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
          if (viewType == COMMON)
              return new ItemViewHolder(LayoutInflater.from(activity).inflate(R.layout.list_layout, parent, false));
          else
              return new SeparatorHolder(LayoutInflater.from(activity).inflate(R.layout.separator_item, parent, false));
      }
      
      @Override
      public void onBindViewHolder(BaseViewHolder holder, int position) {
           if (getItemViewType(position) == COMMON) {
                //do stuff
           } else {
           }
      }
      

      ItemViewHolder 扩展BaseViewHolder
      SeparatorHolder 扩展BaseViewHolder
      BaseViewHolder 扩展RecyclerView.ViewHolder

      【讨论】:

      • 但是我想显示整个列表,如果我们设置了条件,它不会检查视图类型吗?@Vladimir Kulyk
      • @Sid 无论如何,这是做你想做的事情的正确方法。
      【解决方案5】:

      您可以创建两个ViewHolder 类并在onCreateViewHolder 中切换它们。一个包含您的自定义行,其他作为您的自定义列表项。

         class ViewHolderLine extends RecyclerView.ViewHolder { //contains line
          }
      
          class ViewHolderItems extends RecyclerView.ViewHolder { //contains data
          }
      
        @Override
         public int getItemViewType(int position) {
              return item.get(position).getExpenseType();// Assume that this return 1 0r 2
         }
      
        @Override
          public ItemViewHolder onCreateViewHolder(ViewGroup viewGroup,int viewType) {
      
             switch (viewType) {
               case 1: return new ViewHolderLine();
               case 2:
                   View itemView = LayoutInflater.
                  from(viewGroup.getContext()).
                  inflate(R.layout.list_layout, viewGroup, false);
                  return new ItemViewHolder(itemView,viewType);
               }
      
      
        }
      

      您可以查看详细说明here了解更多信息。

      【讨论】:

        猜你喜欢
        • 2012-04-17
        • 2021-09-05
        • 1970-01-01
        • 2023-03-25
        • 1970-01-01
        • 1970-01-01
        • 2015-09-23
        • 2015-10-02
        • 1970-01-01
        相关资源
        最近更新 更多