Страницы

Поиск по вопросам

пятница, 20 декабря 2019 г.

Как добавить в RecyclerView разные элемент

#java #android #recyclerview


У меня есть массив карточке (CardView) которые я загружаю в RecyclerView.

Я хочу разделять эти карточка своим элементом, не пойму как это можно сделать.

К примеру:

RecyclerView 
    Заголовок1, кнопка с действием
    CardView
    CardView
    CardView
    Заголовок2, кнопка с действием
    CardView
    CardView
    CardView
    Заголовок3, кнопка с действием
    CardView
    CardView
    CardView
RecyclerView
    


Ответы

Ответ 1



Вам надо по позиции элемента определять его тип и в зависимости от этого загружать определённую разметку и отображать её: //метод, в коем вы должны в зависимости от позиции элемента возвращать //её тип в виде числа, кое потом используется в onCreateViewHolder для загрузки разметки //и в onBindViewHolder для наполнения её данными @Override public int getItemViewType(int position) { if (position == 0) { return 0; } else { return 1; } } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { RecyclerView.ViewHolder vh; View itemLayoutView; //загружаем разметку в зависимости от типа и возвращаем //нужный холдер switch (viewType) { case 0: itemLayoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.zero_type_layout, parent, false); vh = new HolderZeroType(itemLayoutView); break; case 1: itemLayoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.first_type_layout, parent, false); vh = new HolderFirstType(itemLayoutView); break; } return vh; } @Override public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) { switch (this.getItemViewType(position)) { case 0: HolderZeroType zero = (HolderZeroType) holder; //наполняем данными разметку для нулевого типа break; case 1: HolderFirstType first = (HolderFirstType) holder; //наполняем данными разметку для нулевого типа break; } } public static class HolderFirstType extends RecyclerView.ViewHolder { ... public ViewHolderText(View v) { super(v); ... } } public static class HolderZeroType extends RecyclerView.ViewHolder { ... public ViewHolderText(View v) { super(v); ... } }

Ответ 2



Вот еще один пример в список вставляется Хедер и Футер. Вместо энума можно использовать константы. public class RecyclerAdapter extends RecyclerView.Adapter { int footerHeight; List newCities; private enum ItemType { CARD_VIEW { @Override public int number() { return 1; } }, HEADER { @Override public int number() { return 2; } }, FOOTER { @Override public int number() { return 3; } }; public abstract int number(); } private List mItemList; private final View.OnClickListener mListener; private final View.OnLongClickListener mLongListener; public RecyclerAdapter(List itemList, View.OnClickListener mListener, View.OnLongClickListener mLongListener) { mItemList = itemList; this.mListener = mListener; this.mLongListener = mLongListener; newCities = new ArrayList<>(); } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { Context context = parent.getContext(); if (viewType == ItemType.CARD_VIEW.number()) { final View view = LayoutInflater.from(parent.getContext()). inflate(R.layout.recycler_item, parent, false); return new RecyclerItemViewHolder(view, mListener, mLongListener); } else if (viewType == ItemType.HEADER.number()) { final View view = LayoutInflater.from(context).inflate(R.layout.recycler_header, parent, false); return new RecyclerEmptyViewHolder(view); } else if (viewType == ItemType.FOOTER.number()) { final View view = LayoutInflater.from(context).inflate(R.layout.recycler_footer, parent, false); ViewGroup.LayoutParams params = view.getLayoutParams(); params.height = footerHeight; view.requestLayout(); return new RecyclerEmptyViewHolder(view); } throw new RuntimeException("There is no type that matches the type " + viewType + " + make sure your using types correctly"); } @Override public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) { if (!(isPositionHeader(position) || isLastPosition(position))) { RecyclerItemViewHolder holder = (RecyclerItemViewHolder) viewHolder; String itemText = mItemList.get(position - 1); // we are taking header in to account so all of our items are correctly positioned if (newCities.contains(itemText)) { holder.markCityAsNew(true); } else { holder.markCityAsNew(false); } holder.setItemFavoriteState(PositionManager.getInstance().isFavouriteCity(itemText)); holder.setItemText(itemText); } } public int getBasicItemCount() { return mItemList == null ? 0 : mItemList.size(); } //our new getItemCount() that includes header View @Override public int getItemCount() { return getBasicItemCount() + 1 + 1; // header } // returns viewType for a given position @Override public int getItemViewType(int position) { if (isPositionHeader(position)) { return ItemType.HEADER.number(); } if (isLastPosition(position)) { return ItemType.FOOTER.number(); } return ItemType.CARD_VIEW.number(); } // check if given position is a header private boolean isPositionHeader(int position) { return position == 0; } private boolean isLastPosition(int position) { return position == getItemCount() - 1; } public void setFooterHeight(int height) { footerHeight = height * 4; } public void addCityToNewLocationsList(String city) { newCities.add(city); } }

Ответ 3



Очень интересная библиотека, как раз может решить вашу задачуRendererRecyclerViewAdapter

Комментариев нет:

Отправить комментарий