代码之家  ›  专栏  ›  技术社区  ›  6rchid

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

  •  0
  • 6rchid  · 技术社区  · 6 年前

    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


    编辑

    RecyclerView显示卡的水平列表(大约20个),而除最后一个卡(空白)外的所有卡都使用相同的布局,因此在这种特定的列表情况下仅使用两种视图类型,我们现在可以忽略其他两种类型。这里最后一张卡没有充气,因此在 onCreateViewHolder

    0 回复  |  直到 6 年前
        1
  •  1
  •   ישו אוהב אותך Mahavir    6 年前

    问题可能是因为你在复查 项目视图类型 具有 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);
    }