我有一个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
中调用过。我怀疑虽然前几张卡是使用相同的布局充气的,但不会再次创建布局,因此它假定最后一张卡使用的布局是相同的。
答案 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);
}