2016-05-30 93 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