При работе с RecyclerView в Android часто возникает необходимость использования разных типов представлений (view types). Например, в некоторых приложениях в списке могут присутствовать как обычные элементы, так и рекламные баннеры, которые имеют совершенно другой вид. В таких случаях RecyclerView должен уметь обрабатывать несколько типов представлений.
В базовом варианте, адаптер RecyclerView работает с одним типом представления, который задается в ViewHolder.
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { public static class ViewHolder extends RecyclerView.ViewHolder { public TextView mTextView; public ViewHolder(TextView v) { super(v); mTextView = v; } } // остальной код адаптера }
Однако, если требуется использовать несколько типов представлений, то можно определить их в методе getItemViewType(), возвращая различные значения в зависимости от типа элемента данных.
@Override public int getItemViewType(int position) { if (isPositionHeader(position)) return TYPE_HEADER; if (isPositionFooter(position)) return TYPE_FOOTER; return TYPE_ITEM; }
Затем, в методе onCreateViewHolder() можно создать разные ViewHolder в зависимости от типа представления.
@Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (viewType == TYPE_ITEM) { View itemView = mInflater.inflate(R.layout.recyclerview_item, parent, false); return new ItemViewHolder(itemView); } else if (viewType == TYPE_HEADER) { View headerView = mInflater.inflate(R.layout.recyclerview_header, parent, false); return new HeaderViewHolder(headerView); } else if (viewType == TYPE_FOOTER) { View footerView = mInflater.inflate(R.layout.recyclerview_footer, parent, false); return new FooterViewHolder(footerView); } throw new RuntimeException("Тип представления не найден"); }
И, наконец, в методе onBindViewHolder() можно привязать данные к ViewHolder в соответствии с его типом.
@Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { if (holder instanceof ItemViewHolder) { ((ItemViewHolder) holder).bindData(mData.get(position)); } else if (holder instanceof HeaderViewHolder) { ((HeaderViewHolder) holder).bindData(mHeaderData); } else if (holder instanceof FooterViewHolder) { ((FooterViewHolder) holder).bindData(mFooterData); } }
Таким образом, RecyclerView позволяет работать с несколькими типами представления, что делает его мощным инструментом для создания динамических списков в Android.
Добавить комментарий