我正在使用RecyclerView.Adapter,但我对它的方法onCreateViewHolder
的工作感到困惑。
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
if(viewType==TYPE_ITEM) {
View mView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.inflate_common_item, viewGroup, false);
ViewHolder vh = new ViewHolder(mView);
return vh;
} else {
View mView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.inflate_uncommon_item, viewGroup, false);
ViewHolderFooter vh = new ViewHolderFooter(mView);
return vh;
}
}
因此,我的列表中有10个项目,因此对于每个项目,此方法将被调用,每次创建新的ViewHolder
时,每次查看一次,但现在我的问题当我们使用ListView
和BaseAdapter
时,我们将ViewHolder
存储在标记中并使用它。我们不会为每件商品创建ViewHolder
。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
MyViewHolder mViewHolder;
if(convertView == null) {
convertView = inflater.inflate(R.layout.layout_list_item, null);
mViewHolder = new MyViewHolder();
convertView.setTag(mViewHolder);
} else {
mViewHolder = (MyViewHolder) convertView.getTag();
}
mViewHolder.tvTitle = detail(convertView, R.id.tvTitle, myList.get(position).getTitle());
mViewHolder.tvDesc = detail(convertView, R.id.tvDesc, myList.get(position).getDescription());
mViewHolder.ivIcon = detail(convertView, R.id.ivIcon, myList.get(position).getImgResId());
return convertView;
}
所以我们不创建额外的视图对象。请帮助我理解利弊。
由于
答案 0 :(得分:19)
onCreateViewHolder
仅在RecyclerView
可以重复使用的现有视图持有者时才创建新的视图持有者。因此,例如,如果您的RecyclerView
一次可以显示5个项目,则会创建5-6 ViewHolders
,然后在每次调用onBindViewHolder
时自动重复使用它们。
它类似于ListView
中的代码所做的(检查convertView
是否为null
,如果不是,则从标记中抓取现有的ViewHolder
),但,RecyclerView
,这一切都是自动完成的。
我认为这是使用RecyclerView
的专业人士之一 - 您不必像对ViewHolders
一样重用ListView
。 con是,RecyclerView
是非常可定制的,但内置功能很少 - 与ListView
不同,它不是很可定制的,但具有很多内置功能。