2012-11-02 42 views
1

我有一個自定義的適配器來顯示gridview中的一些圖像。如何更新除進度條外的適配器?

public class CustomAdapter extends BaseAdapter { 


    private Context context; 

    ArrayList<String> list = null; 


    public CustomAdapter (Context context, ArrayList<String> list) { 
     this.context = context; 
     this.list = list; 
    } 

    l 
    public int getCount() { 
     return list.size(); 
    } 


    public Object getItem(int paramInt) { 
     return paramInt; 
    } 


    public long getItemId(int paramInt) { 
     return paramInt; 

    } 


    public View getView(int position, View child, ViewGroup parent) { 
     String string= list.get(position); 
     Bitmap bitmap = null; 
     LayoutInflater inflater = LayoutInflater.from(context); 
     View view = inflater.inflate(R.layout.grid_item, null); 
     RelativeLayout parentLayout = (RelativeLayout) view 
       .findViewById(R.id.parentLayout); 

     ImageView iView = (ImageView) view.findViewById(R.id.imageView); 
     final ProgressBar progress = (ProgressBar) view.findViewById(R.id.progress); 

     if (string != null) { 
      bitmap = BitmapFactory.decodeFile(string); 
     } else { 
      bitmap = BitmapFactory.decodeResource(context.getResources(), 
        R.drawable.img_loading); 
     } 
     iView.setImageBitmap(bitmap); 
     iView.setTag(position); 

     return view; 
    } 


} 

這是gridview的適配器。當選擇gridview項目時,它下載一個相應的文件,並且進度條變得可見。但是,當我調用notifyDatasetChanged()時,進度條會保留其初始狀態。

即使notifyDatasetChanged()被調用,我如何保持/顯示進度條的狀態/進度?

感謝

回答

0

當你做對notifyDatasetChanged() - getView調用所有清單上顯示的項。你的進步被破壞,因爲這是一個新的觀點。一個優化的事情可能是使用convertView並檢查(通過列表中的字符串值),如果convertedView與前一個視圖相同。當你在大多數情況下不移動列表時,convertView應該是完全相同的視圖,你可以進行更改並將其返回。這將是相同的進度欄,所以進度不會丟失。 爲了使它在所有情況下都能正常工作,您應該記住所有當前下載項目的進度(例如String的整數,整數等名稱 - >進度),並在getView方法中獲取當前進度。

getView(...){ 
    String string= list.get(position); 
    Integer progress = map.get(string); 
    if (progress != null){ 
     final ProgressBar progress = (ProgressBar) view.findViewById(R.id.progress); 
     progress.setProgress(progress); 
    } 
    .... 
} 

PS。在你的代碼中,我看到:

public View getView(int position, View child, ViewGroup parent) 

在getView第二個參數是不是一個「孩子」,而是「convertView」 - 用於優化您的清單。主要思想是隻有當convertView爲null時才應該誇大視圖,否則應該更新它並使用它。這總是一個從屏幕消失的觀點。編輯: 我忘了1件事。我想下載更新進度條。您的下載器任務保留對他更新的ProgressBar的引用。你需要給他新的progressBar或者保存他正在使用的那個(例如HashMap String - > ProgressBar而不是Integer),並以某種方式在getView方法中使用它。例如addChild ...當你確定這總是同一個ProgressBar實例 - 一切都會正常工作:)