getItemViewType仅在onBindViewHolder中返回,而在onCreateViewHolder中不返回

时间:2019-03-28 00:06:59

标签: java android android-recyclerview recycler-adapter

我有一个RecyclerView适配器,该适配器应根据getItemViewType返回的内容来增加4种不同的布局。

触发视图时应返回每种视图类型,但问题是该类型之一不在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)时,onCreateViewHolder内仅返回0、1和3,而不返回2。

但是奇怪的是,将其记录在onBindViewHolder内会返回0到3之间的所有视图类型。


编辑

RecyclerView显示一张纸牌的水平列表(大约20张),而除最后一张纸牌(空白)之外的所有卡片都使用相同的布局,因此在这种特定的列表情况下,仅使用2种视图类型,我们可以忽略其他2种类型的现在。在这里,最后一张卡没有膨胀,因此从未在onCreateViewHolder中调用过。我怀疑虽然前几张卡是使用相同的布局充气的,但不会再次创建布局,因此它假定最后一张卡使用的布局是相同的。

1 个答案:

答案 0 :(得分:2)

问题可能是因为您正在getItemViewType(i));内用onCreateViewHolder重新检查 itemViewType 。您不应该这样做,因为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);
}