为了账号安全,请及时绑定邮箱和手机立即绑定

getItemViewType 仅在 onBindViewHolder 中返回

getItemViewType 仅在 onBindViewHolder 中返回

月关宝盒 2022-09-07 17:07:50
我有一个RecyclerView适配器,它应该根据返回的内容膨胀4种不同的布局。getItemViewType触发视图时应返回每个视图类型,但问题是其中一个类型不在 onCreateViewHolder 中返回,而仅在 onBindViewHolder 中返回,从而阻止创建 ViewHolder。另外,我向您保证只返回正确的数据大小,因此这应该不是问题所在。getItemCount我认为如果视图类型可以成功返回,那么它们在调用时应该会显示在两个方法中。所以这个问题对我来说没有任何意义。@NonNull@Overridepublic 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
查看完整描述

1 回答

?
眼眸繁星

TA贡献1873条经验 获得超9个赞

问题可能是因为您正在重新检查具有 内部的项ViewType。您不应该这样做,因为已经从其参数中为您提供了 itemViewType。您应该使用开关大小写,而不是使您的代码更具可读性。getItemViewType(i));onCreateViewHolderonCreateViewHolderif ? :


因此,请将代码更改为如下所示的内容:


@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);

}


查看完整回答
反对 回复 2022-09-07
  • 1 回答
  • 0 关注
  • 79 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信