У меня есть адаптер RecyclerView, который должен надувать 4 разных макета в зависимости от того, что возвращает getItemViewType
.
Каждый тип представления должен быть возвращен при запуске представления, но проблема в том, что один из типов не возвращается внутри onCreateViewHolder, а возвращается только в onBindViewHolder, что препятствует созданию ViewHolder. Также уверяю вас, getItemCount
возвращает только правильный размер данных, так что это не должно быть проблемой.
Я полагаю, что если типы представлений могут быть возвращены успешно, они должны отображаться в обоих методах при вызове. Так что этот вопрос не имеет никакого смысла для меня.
@NonNull
@Override
public HorizontalViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int i) {
Log.d(SLIDER_TAG, "onCreateViewHolder: " + getItemViewType(i));
View cardView = LayoutInflater.from(parent.getContext()).inflate(
getItemViewType(i) == 0 ? R.layout.item_category_slider_viewed
: getItemViewType(i) == 1 ? R.layout.item_category_slider_added
: getItemViewType(i) == 2 ? R.layout.item_category_slider_browse_all
: R.layout.item_category_slider_regular
, parent, false);
return new HorizontalViewHolder(cardView, context);
}
При регистрации getItemViewType(i)
только 0, 1 и 3 всегда возвращаются внутри onCreateViewHolder
, но не 2.
Но, как ни странно, регистрация того, что внутри onBindViewHolder
возвращает все типы представлений от 0 до 3. Почему это так?
EDIT
RecyclerView отображает горизонтальный список карточек (около 20), в то время как все, кроме последней карточки (пустой), используют одну и ту же компоновку, поэтому в этом конкретном случае списка используются только 2 типа представлений, мы можем игнорировать другие 2 типа для сейчас. Здесь последняя карта не раздувается, поэтому никогда не вызывается в onCreateViewHolder
. Я подозреваю, что хотя первые несколько карт были накачаны с использованием одной и той же компоновки, макеты не создаются снова, поэтому предполагается, что последняя карта использует ту же компоновку.