gpt4 book ai didi

Android自定义Listview在一个ListItem中使用多个Imageview时速度太慢

转载 作者:行者123 更新时间:2023-11-29 15:42:35 24 4
gpt4 key购买 nike

我认为这个问题的标题很明确。我不知道我该如何解释,但为了 ListView 的性能,我尝试了很多东西,例如使用 ViewHolder,将位图保存在列表中并在我的适配器的 getView() 方法中引用它们,删除 getView() 中的每个控制和 onClicklistener 方法等。但是根据我的经验,在一个 ListItem 中使用 2 个 ImageView 是可以的,但是当使用 3 个 ImageView 时,初始化和滚动都非常慢。

ArrayList<User> users;
Context context;
DatabaseHelper db;
LayoutInflater inflater;
Bitmap defaultImage;
ArrayList<Bitmap> userPhotos;
Bitmap messageImage;
Bitmap callImage;

public FriendsAdapter(Context context){
this.context = context;
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
db = new DatabaseHelper(context);
users = db.getFriends();
defaultImage = BitmapFactory.decodeResource(context.getResources(), R.drawable.no_image_small);
userPhotos = new ArrayList<Bitmap>();
for (int i = 0; i < users.size(); i++){
if(users.get(i).getPhoto() != null && !users.get(i).getPhoto().isEmpty()){
userPhotos.add(getCircularCroppedBitmap(stringToBitMap(users.get(i).getPhoto())));
}
else{
userPhotos.add(null);
}
}
messageImage = BitmapFactory.decodeResource(context.getResources(), R.drawable.message);
callImage = BitmapFactory.decodeResource(context.getResources(), R.drawable.call);

}

在这里你可以看到两张图片来自 drawable 和一张来自 string 但这对于 siliding 并不重要,因为它们都存储在变量中。

@Override
public View getView(final int position, View convertView, ViewGroup parent) {


ViewHolder holder;

if(convertView == null){
convertView = inflater.inflate(R.layout.friend_item, parent, false);

holder = new ViewHolder();
holder.imageViewPhoto = (ImageView) convertView.findViewById(R.id.friend_item_photo);
holder.textViewName = (TextView) convertView.findViewById(R.id.friend_item_name);
holder.imageViewMessage = (ImageView) convertView.findViewById(R.id.friend_item_message_photo);
holder.imageViewCall = (ImageView) convertView.findViewById(R.id.friend_item_call_photo);

convertView.setTag(holder);
}
else{
holder = (ViewHolder) convertView.getTag();
}
holder.imageViewMessage.setImageBitmap(messageImage);
//holder.imageViewCall.setImageBitmap(callImage);

User user = users.get(position);

Bitmap photo = userPhotos.get(position);
if(photo == null){
holder.imageViewPhoto.setImageBitmap(defaultImage);
}
else{
holder.imageViewPhoto.setImageBitmap(photo);
}

holder.textViewName.setText(user.getName() + " " + user.getSurname());


return convertView;
}

private static class ViewHolder{
ImageView imageViewPhoto;
TextView textViewName;
ImageView imageViewMessage;
ImageView imageViewCall;

}

在这段代码中一切正常。但是当我执行 holder.imageViewCall.setImageBitmap(callImage);一切都太慢了。

<ImageView
android:id="@+id/friend_item_photo"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"/>

<TextView
android:id="@+id/friend_item_name"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="3"
android:maxLines="1"
android:gravity="center_vertical"/>

<ImageView
android:id="@+id/friend_item_call_photo"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"/>

<ImageView
android:id="@+id/friend_item_message_photo"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"/>

这是我的 listItem xml。 linearLayout 包含它,但我不能在此处添加它。这是我的第一篇文章。

编辑:它已经是一个基础适配器。

最佳答案

适配器的构造函数在主线程上做很多的工作。

  1. 首先,您正在执行数据库查询,这可能会很慢,或者如果另一个线程同时写入数据库,则可能会阻塞。

  2. 您的数据库代码未发布,但看起来您正在遍历 Cursor 并根据结果构建 ArrayList。这样做很好,但需要时间。如果您直接使用游标,则可以在查询完成后立即返回它。

  3. 您再次遍历所有结果并为每个项目创建一个图像,这涉及从某处 (I/O) 加载位图并将其裁剪成圆形。位图操作通常并不便宜。此外,您正在为每个项目创建这些图像并将其存储在内存中,但用户可能永远不会看到更多的项目。如果您总共有 1000 个项目,但屏幕上只能容纳 10 行,那么您制作的图像比现在需要的多 990 张。用户可能永远不会滚动浏览所有项目,这意味着您在看不到的图像上浪费了很多工作。

同样,所有都发生在主线程上。我猜 #3 是花费大部分时间的地方。

对于问题 1 和 2,您应该学习如何使用 Loader 框架或其他一些异步机制在后台线程上加载数据。通常 Activity 或 Fragment 对此负责,而不是适配器本身。这可能仍然需要一些时间,但它会在后台进行,因此主线程不会被阻塞,您可以在等待时在屏幕上显示加载微调器。

对于问题 3,您应该使用 Glide 或 Fresco 等图像缓存框架。这些库按需在后台加载图像并缓存它们(这样,如果您再次需要相同的图像,如果图像仍在缓存中,它可以跳过加载)。当 getView() 被调用时,开始加载该项目的图像。加载完成后,为该行设置图像——通常这些框架会自动执行此操作,您甚至可以指定在加载时显示的默认图像。

关于Android自定义Listview在一个ListItem中使用多个Imageview时速度太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38155570/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com