getItemViewType возвращается только в onBindViewHolder, но не в onCreateViewHolder - PullRequest
0 голосов
/ 28 марта 2019

У меня есть адаптер 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. Я подозреваю, что хотя первые несколько карт были накачаны с использованием одной и той же компоновки, макеты не создаются снова, поэтому предполагается, что последняя карта использует ту же компоновку.

1 Ответ

2 голосов
/ 28 марта 2019

Возможно, проблема в том, что вы перепроверяете для itemViewType с getItemViewType(i)); внутри onCreateViewHolder. Вы не должны этого делать, потому что onCreateViewHolder уже предоставляет вам itemViewType из его параметров. И вы должны использовать регистр переключателя вместо if ? :, чтобы сделать ваш код более читабельным.

Итак, измените ваш код на что-то вроде этого:

@Override
public HorizontalViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

    int layoutId;
    switch(viewType) {
       case 0:
         layoutId = R.layout.item_category_slider_viewed;
       break;
       case 1:
         layoutId = R.layout.item_category_slider_added;
       break;
       case 2:
         layoutId = R.layout.item_category_slider_browse_all;
       break;
       default:
         layoutId = R.layout.item_category_slider_regular;

    }

    View cardView = LayoutInflater.from(parent.getContext()).inflate(
                    layoutId, parent, false);

    return new HorizontalViewHolder(cardView, context);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...