RecyclerView с различными Cardlayouts

Что я хотел бы сделать


В настоящий момент я играю с RecyclerView и CardView. На данный момент я написал a RecyclerView.Adapter, на котором я могу отображать один и тот же CardView несколько раз с другим контентом - аналогом ListView с BaseAdapter.

Теперь я хотел бы написать RecyclerView с разными CardView-Layout (в стиле Google Now). Я уже искал учебники, но не нашел ничего полезного в этой теме. Кто-нибудь знает, как это нужно реализовать? Что нужно сделать, чтобы понять это?

Ответ 1

Чтобы достичь желаемого, вам необходимо переопределить getItemViewType(position) на RecyclerView.Adapter, где вы вернете int сообщая вам, какой вид будет использоваться для представления этой позиции.

Затем вы создадите различные ViewHolders на createViewHolder (parent,viewType), которые будут содержать ссылки на каждый отдельный CardLayout в вашем случае.

Затем на bindViewHolder(holder, position) вы можете создать оператор switch или, если еще раз, просмотреть список возможных видов и заполнить их данных.

Пример кода ниже:

public GeneralViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {

    GeneralViewHolder holder;
    View v;
    Context context = viewGroup.getContext();

    if (viewType == FIRST_TYPE) {
        v = LayoutInflater.from(context)
                .inflate(R.layout.first_card, viewGroup, false);

        holder = new FirstTypeViewHolder(v); //Of type GeneralViewHolder
    } else {
        v = LayoutInflater.from(context)
                .inflate(R.layout.second_card, viewGroup, false);
        holder = new SecondTypeViewHolder(v);
    }

    return holder;
}

public void onBindViewHolder(GeneralViewHolder viewHolder, int i) {
    if(getItemViewType(i)==FIRST_TYPE) {
        FirstTypeViewHolder holder1 = (FirstTypeViewHolder)viewHolder;
    } else {
        SecondTypeViewHolder holder1 = (SecondTypeViewHolder)viewHolder;
    }
}

public int getItemViewType (int position) {
    //Some logic to know which type will come next;
    return Math.random()<0.5 ? FIRST_TYPE : SECOND_TYPE;
}