如何在recyclerview内的特定位置添加分隔符?

时间:2016-04-21 10:07:22

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

我有一个任务列表列表。为了显示列表,我使用了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个项目之后放置分隔符? 谢谢..

5 个答案:

答案 0 :(得分:3)

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

...YourRecyclerAdapter extends RecyclerView.Adapter<BaseViewHolder>

public static final int COMMON = 1;
public static final int SEPARATOR = 2;

覆盖getItemViewType的<{1}}方法:

Adapter

更改@Override public int getItemViewType(int position) { if (position%10 == 0) //each 10 row is separator (change it!) return SEPARATOR; else return COMMON; } 的<{1}}方法:

onCreateViewHolder

Adapter延长@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

答案 1 :(得分:2)

您可以创建两个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

答案 2 :(得分:2)

一种解决方案是定义2种类型的RecyclerView行(一行用于普通行,一行用于分隔符) 另一种解决方案是Separator View

底部的custom RecycleView row xml
<View
    android:id="@+id/separatorView"
    android:layout_width="match_parent"
    android:layout_height="3dp"
    android:visible="gone"
    android:background="@android:color/darker_gray"/>

然后在bindViewHolder的{​​{1}}中,隐藏正常行中的分隔符并在分隔行中显示

RecyclerView.Adapter

希望这个帮助

答案 3 :(得分:1)

如果你知道你只想在前三个项目中添加分隔符,那么你可以在position内部根据项目的onBindViewHolder设置一个条件。

ps:请不要忘记在if块

之后添加一个else块

答案 4 :(得分:1)

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

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)
    }
}
}

并在createviewholder中创建相应的视图,相应地绑定。

使用

  

parent.getChildViewHolder(parent.getChildAt(i))的

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

146GB 10K 2GB FC
23536RPM SATA II 1000GB
NX24 623GB 1587K SA55S 15X3.5 DAE UPG
X 3TB N 15X3.5 DAE UQ
TY 1.8TB 10K SAS 25X2.53 DR
2TB 72PM II FGH DTTR
450GB 15KS 12V 4GB FC UPG

请记住用有效值替换颜色,填充,分隔符高度。

希望它有所帮助!