getItemViewType 仅在 onBindViewHolder 中返回

我有一个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);

}

记录时,只有 0、1 和 3 会在 内部返回,但不会返回 2。getItemViewType(i)onCreateViewHolder


但奇怪的是,在 内部记录该日志会返回从 0 到 3 的所有视图类型。为什么会这样呢?onBindViewHolder


编辑


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


月关宝盒
浏览 80回答 1
1回答

眼眸繁星

问题可能是因为您正在重新检查具有 内部的项ViewType。您不应该这样做,因为已经从其参数中为您提供了 itemViewType。您应该使用开关大小写,而不是使您的代码更具可读性。getItemViewType(i));onCreateViewHolderonCreateViewHolderif ? :因此,请将代码更改为如下所示的内容:@Overridepublic 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);}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java