Как добавить разделитель в определенном месте в представлении реселлера?

У меня есть список задач. Чтобы показать список, я использовал 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 ответов

Решение

Одним из решений является определение 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 вашей RecyclerView.Adapter, скрыть разделитель в обычном ряду и увидеть его в строке разделителя

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

Надеюсь это поможет

Вы должны определить 2 типа строк RecyclerView:

...YourRecyclerAdapter extends RecyclerView.Adapter<BaseViewHolder>

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

Override getItemViewType метод вашего Adapter:

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

+ Изменить 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
BaseViewHolder продолжается RecyclerView.ViewHolder

Вы можете создать два 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);
         }


  }

Вы можете увидеть подробное описание здесь для получения дополнительной информации.

У меня есть просмотрщик с заголовком раздела и переменным количеством элементов в каждом разделе. Раздел должен иметь разделитель строк по всему экрану. и предметы должны иметь мягкую линию между ними. введите описание изображения здесь Итак, мое решение (в kotlin) имело два видоискателя, один для заголовка и один для элемента. в getItemViewType возвращает тип, основанный на элементе.

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

и создайте соответствующий видоискатель в createviewholder, свяжите соответственно.

Используемый

parent.getChildViewHolder(parent.getChildAt(я))

определить отступы (или цвет или ширину) для разделителя элементов.

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

не забудьте заменить цвет, отступы, высоту разделителя на допустимые значения.

Надеюсь, поможет!

Если вы знаете, что вы собираетесь добавить разделитель только в первые три элемента, то вы можете поставить условие на основе position предмета, внутри onBindViewHolder,

PS: Пожалуйста, не забудьте добавить блок else после блока if

Другие вопросы по тегам