11

Что я хотел бы сделатьRecyclerView с различными Cardlayouts


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

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

+0

https://developer.android.com/training/material/lists-cards.html. И для разных макетов просто измените ViewType на вашем адаптере. –

+0

@PedroOliveira. Я уже читал это, но он показывает только, как это было с одной картой, а не с разными. – safari

+0

Вам нужно переопределить 'getItemViewType' на вашем адаптере и вернуть другой вид, чтобы вы могли раздувать различные макеты на вашем' onCreateViewHolder' (который получает тип представления как параметр 2º). –

ответ

16

Для достижения нужного вам значения необходимо переопределить 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; 
} 
+0

Это здорово, спасибо, я попробую. :-)! +1 – safari

Смежные вопросы