gpt4 book ai didi

java - 在缓存中存储 ListView 图像

转载 作者:行者123 更新时间:2023-12-01 09:52:16 26 4
gpt4 key购买 nike

我有一个包含 100 多个项目的 ListView,每个项目都有不同的图像。图像已经在可绘制文件夹中,因此我不会向任何服务器请求。

当我滚动 ListView 时,因为手机必须再次渲染每个图像,有时它会变得有点慢,看起来帧率很低。出于测试目的,我对所有项目使用了相同的图像,并且滚动效果要好得多,所以我认为问题确实是需要渲染不同的图像。

我的问题是:我可以将这些图像存储在缓存或其他东西上以使滚动更顺畅吗?这是我的 ListView 适配器代码:

public class AdapterItens extends BaseAdapter implements ListAdapter {

private final JSONArray jsonArray;

static class ViewHolder {
ImageView itemAvatar;
TextView itemName;
TextView itemId;
}

public AdapterItens(JSONArray jsonArray) {
this.jsonArray = jsonArray;
}

@Override
public int getCount() {
return jsonArray.length();
}

@Override
public JSONObject getItem(int position) {
return jsonArray.optJSONObject(position);
}

@Override
public long getItemId(int position) {
JSONObject jsonObject = getItem(position);
return jsonObject.optLong("id");
}

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

if (convertView == null) {
final LayoutInflater inflater = LayoutInflater.from(Controller.getContext());
convertView = inflater.inflate(R.layout.item_layout, parent, false);

viewHolder = new ViewHolder();
viewHolder.itemAvatar = (ImageView) convertView.findViewById(R.id.avatar_item);
viewHolder.itemName = (TextView) convertView.findViewById(R.id.name_item);
viewHolder.itemId = (TextView) convertView.findViewById(R.id.id_item);

convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}

final JSONObject jsonData = getItem(position);
viewHolder.itemAvatar.setImageResource(Controller.getContext().getResources().getIdentifier(jsonData.getString("itemAvatar"), "drawable", Controller.getContext().getPackageName()));
viewHolder.itemName.setText(jsonData.getString("itemName"));
viewHolder.itemId.setText(jsonData.getString("itemId"));

return convertView;
}
}

最佳答案

我想问题是你“动态”解析 JSON。首先将 JSON 解析为 AsyncTask 中包含对象的列表,每个对象将包含 id、名称和位图。

例如:

class YourObjectName {
long id;
String name;
Bitmap bitmap;
}

您的代码将如下所示:

static class ViewHolder {
ImageView itemAvatar;
TextView itemName;
TextView itemId;
}

public ItemsAdapter (List<YourObjectName> yourObjectsList) {
this.yourObjectsList = yourObjectsList;
}

@Override
public int getCount() {
return yourObjectsList.size();
}

@Override
public YourObjectName getItem(int position) {
return yourObjectsList.get(position);
}

@Override
public long getItemId(int position) {
return yourObjectsList.get(position).id;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder viewHolder;
if (convertView == null) {
final LayoutInflater inflater = LayoutInflater.from(Controller.getContext());
convertView = inflater.inflate(R.layout.item_layout, parent, false);

viewHolder = new ViewHolder();
viewHolder.itemAvatar = (ImageView) convertView.findViewById(R.id.avatar_item);
viewHolder.itemName = (TextView) convertView.findViewById(R.id.name_item);
viewHolder.itemId = (TextView) convertView.findViewById(R.id.id_item);

convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}

YourObjectName itemAtPosition = yourObjectsList.get(position);
viewHolder.itemAvatar.setImageBitmap(itemAtPosition.bitmap);
viewHolder.itemName.setText(itemAtPosition.name);
viewHolder.itemId.setText(itemAtPosition.id);

return convertView;
}

最后,您可以使用 Glide 或 Picasso 等库在后台加载图片。

只需将此行替换为该库之一,然后用位图保存drawable_id。

viewHolder.itemAvatar.setImageBitmap(itemAtPosition.bitmap);

滑行: https://github.com/bumptech/glide

Glide.with(context)
.load(itemAtPosition.drawable_id)
.resize(width, height)
.centerCrop()
.into(viewHolder.itemAvatar);

毕加索: http://square.github.io/picasso/

Picasso.with(context)
.load(itemAtPosition.drawable_id)
.override(width, height)
.centerCrop()
.into(viewHolder.itemAvatar);

此外,强烈建议使用 recyclerview 而不是 listview,看看已接受的答案。 Android Recyclerview vs ListView with Viewholder

关于java - 在缓存中存储 ListView 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37531342/

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