Тесты Протестировать код
Программирование Аналитика Дизайн Маркетинг Управление проектами
02 Сен 2023
2 мин
418

Создание RecyclerView с несколькими типами представления в Android

Пройдите тест, узнайте какой профессии подходите

При работе с RecyclerView в Android часто возникает необходимость использования разных типов представлений (view types). Например, в некоторых приложениях в списке

При работе с 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.

Добавить комментарий