2016-05-30 83 views
0

我有一个ListView超过100个项目,每个项目有不同的图像。图像已经在可绘制文件夹中,所以我没有向任何服务器请求。在缓存中存储ListView图像

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

我的问题是:我可以将这些图像存储在缓存或其他东西,使这个滚动窒息?这里是我的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; 
    } 
} 

回答

1

我认为问题在于你“在运行中”解析JSON。 首先用AsyncTask中的对象将JSON解析为列表,每个对象将包含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; 
} 

最后,你可以使用图书馆像滑翔或毕加索加载您的照片中的背景。

只需将此行替换为此库中的一个,而不是位图保存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代替列表视图,采取接受的答案看看。 Android Recyclerview vs ListView with Viewholder

+0

因为适配器预计现在列表,而不是OS JSON数组,林不知道这一行是如何工作的: @覆盖 众长getItemId(INT位置){ 回报yourObjectsList.get(位置).ID; } 这里出现错误。 – Ravers

+0

错误描述说什么? –

+0

对不起,错误是:“无法解析符号”ID“” – Ravers