Страницы

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

суббота, 6 июля 2019 г.

Каким образом подсоединить горизонтальное recyclerView в вертикальный recyclerView?

Нужно создать вертикальный список элементов с одним элементом, в котором элементым в горизонтальном положении. Поэтому нужно использовать два recyclerViewAdapter, но проблема в не понимании этого. Каким образом это делается? Уже есть вертикальный adapter
public class ProductsAdapter extends RecyclerView.Adapter {
@NonNull private List baseProductsItems; @Nullable private OnItemClickListener onItemClickListener;
public ProductsAdapter(@NonNull List baseProductsItems, @Nullable OnItemClickListener onItemClickListener) { this.baseProductsItems = baseProductsItems; this.onItemClickListener = onItemClickListener; }
@NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view; switch (viewType){ case ProductsType.TITLE: view = LayoutInflater.from(parent.getContext()) .inflate(R.layout.item_title_products, parent, false); return new TitleVH(view); case ProductsType.DEPOSIT: view = LayoutInflater.from(parent.getContext()) .inflate(R.layout.item_deposits_products, parent, false); return new DepositVH(view); case ProductsType.CREDIT: view = LayoutInflater.from(parent.getContext()) .inflate(R.layout.item_credits_products, parent, false); return new CreditVH(view); case ProductsType.DEBIT_CARD: view = LayoutInflater.from(parent.getContext()) .inflate(R.layout.item_debitcards_products, parent, false); return new DebitCardVH(view); case ProductsType.CREDIT_CARD: view = LayoutInflater.from(parent.getContext()) .inflate(R.layout.item_creditcards_products, parent, false); return new CreditCardVH(view); } return null; }
@Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { holder.itemView.setTag(position); BaseProductsItem item = baseProductsItems.get(position); if (item instanceof TitleProductsItem) { TitleVH titleVH = (TitleVH) holder; TitleProductsItem titleItem = (TitleProductsItem) item; titleVH.tvTitle.setText(null); } else if (item instanceof DepositsProductsItem) { DepositVH depositVH = (DepositVH) holder; DepositsProductsItem depositItem = (DepositsProductsItem) item; depositVH.tvNameDeposits.setText(null); depositVH.tvOpenedDeposits.setText(null); depositVH.tvAmountDeposits.setText(null); } else if (item instanceof CreditsProductsItem) { CreditVH creditVH = (CreditVH) holder; CreditsProductsItem creditItem = (CreditsProductsItem) item; creditVH.tvNameCredits.setText(null); creditVH.tvNextPaymentDateCredits.setText(null); creditVH.tvNextPaymentAmountCredits.setText(null); creditVH.tvAmountCredits.setText(null); } else if (item instanceof DebitCardsProductsItem) { DebitCardVH debitCardVH = (DebitCardVH) holder; DebitCardsProductsItem cardItem = (DebitCardsProductsItem) item; debitCardVH.tvDebitCardsNumber.setText(null); debitCardVH.tvDebitCardsName.setText(null); debitCardVH.tvDebitCardsAmount.setText(null); } else if (item instanceof CreditCardsProductsItem) { CreditCardVH creditCardVH = (CreditCardVH) holder; CreditCardsProductsItem cardItem = (CreditCardsProductsItem) item; creditCardVH.tvCreditCardsNumber.setText(null); creditCardVH.tvCreditCardsName.setText(null); creditCardVH.tvCreditCardsAmount.setText(null); } }
public static class TitleVH extends RecyclerView.ViewHolder {
@BindView(R.id.tvTitle) TextView tvTitle;
public TitleVH(View itemView) { super(itemView); ButterKnife.bind(this, itemView); } }
public static class AccountVH extends RecyclerView.ViewHolder { public AccountVH(View itemView) { super(itemView); } }
public static class DepositVH extends RecyclerView.ViewHolder {
@BindView(R.id.tvNameDeposits) TextView tvNameDeposits;
@BindView(R.id.tvOpenedDeposits) TextView tvOpenedDeposits;
@BindView(R.id.tvAmountDeposits) TextView tvAmountDeposits;
public DepositVH(View itemView) { super(itemView); ButterKnife.bind(this, itemView); } }
public static class CreditVH extends RecyclerView.ViewHolder {
@BindView(R.id.tvNameCredits) TextView tvNameCredits;
@BindView(R.id.tvNextPaymentDateCredits) TextView tvNextPaymentDateCredits;
@BindView(R.id.tvNextPaymentAmountCredits) TextView tvNextPaymentAmountCredits;
@BindView(R.id.tvAmountCredits) TextView tvAmountCredits;
public CreditVH(View itemView) { super(itemView); ButterKnife.bind(this, itemView); } }
public static class DebitCardVH extends RecyclerView.ViewHolder {
@BindView(R.id.tvDebitCardsName) TextView tvDebitCardsName;
@BindView(R.id.tvDebitCardsNumber) TextView tvDebitCardsNumber;
@BindView(R.id.tvDebitCardsAmount) TextView tvDebitCardsAmount;
public DebitCardVH(View itemView) { super(itemView); ButterKnife.bind(this, itemView); } }
public static class CreditCardVH extends RecyclerView.ViewHolder {
@BindView(R.id.tvCreditCardsName) TextView tvCreditCardsName;
@BindView(R.id.tvCreditCardsNumber) TextView tvCreditCardsNumber;
@BindView(R.id.tvCreditCardsAmount) TextView tvCreditCardsAmount;
public CreditCardVH(View itemView) { super(itemView); ButterKnife.bind(this, itemView); } }
@Override public int getItemCount() { return baseProductsItems.size(); }
@Override public int getItemViewType(int position) { BaseProductsItem item = baseProductsItems.get(position); if (item instanceof DepositsProductsItem) return ProductsType.DEPOSIT; else if (item instanceof CreditsProductsItem) return ProductsType.CREDIT; else if (item instanceof DebitCardsProductsItem) return ProductsType.DEBIT_CARD; else if (item instanceof CreditCardsProductsItem) return ProductsType.CREDIT_CARD; else if (item instanceof TitleProductsItem) return ProductsType.TITLE; else return 0; }
}


Ответ

Почитал ваш код, надеюсь это stackoverflow сжал его в один файл) Все так же, как и раньше, но теперь во ViewHolder инициализирован RecyclerView. Для него вы создаете новый адаптер и новый вьюхолдер. Такая модель с легкостью работает и живет, если данные внутри RecyclerView не кликабельны, т.е. просто для отображения. Другой вопрос, когда вам нужно обрабатывать клики по по внутреннему RecyclerView, с изменением общих данных. Отсюда у вас два путя: либо хранить адаптеры для каждого внутреннего RecyclerView, либо вытягивать данные из ViewHodler-a.
Вариант второй - это реализовать внутренний RecyclerView в отдельной фрагменте. Тогда вы сможете полностью разделить логику двух RecyclerView, но это опять-таки все зависит от задачи.
Первый вариант я реализовывал для кастомного календаря, где месяцы скрлились горизонтально, а внутренний RecyclerView был месяцем с днями.

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

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