为了回答你的问题,我要回到
ListView
. 让我们想象一下,我有一个简单的列表,其中每一行只是一个标题和一个图像。一个非常幼稚的实现
getView()
要支持该列表,可以如下所示:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
View view = inflater.inflate(R.layout.itemview, parent, false);
TextView title = view.findViewById(R.id.title);
title.setText("hello world");
ImageView image = view.findViewById(R.id.image);
image.setImageResource(R.drawable.my_image);
return view;
}
此实现中有两个主要的性能问题来源:
-
我们每次都在夸大一个新的观点
-
我们正在打电话
findViewById()
每一次
通过使用
convertView
参数,第2个问题由“视图保持器模式”求解。当谷歌开发团队创建
RecyclerView
要替换的API
列表视图
,他们使“视图持有者”成为一等公民,现在每个人都与
RecyclerView.ViewHolder
默认情况下为。
重要的是要记住,避免重复视图膨胀和重复视图查找的性能增益是
太有价值了
谷歌将其融入新系统。
现在让我们看看你的代码。。。
public void onBindViewHolder(MoviesViewHolder holder, int i) {
...
for (ObjectShort object: items.get(i).getObjects()) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.item_category, holder.linearCategories, false);
ImageView img = (ImageView) view.findViewById(R.id.iv_wallpaper);
imageLoader.load(img, object.getImg().getPoster().getThumbnail());
holder.linearCategories.addView(view);
}
}
这
for
绑定方法中的循环具有与我的天真方法相同的问题
getView()
上述实施已完成。为类别中的每个项目扩展新视图,并调用
掌握它的
ImageView
这将是昂贵的,尤其是当用户抛出列表时。
要解决性能问题,只需对“内部”内容列表应用与“外部”内容相同的逻辑:使用
回收视图
对于项目(每个内部
ViewHolder
对于类别)。
https://gist.github.com/zizibaloob/2eb64f63ba8d1468100a69997d525a54