2012-10-27 29 views
0

意外地工作,我有一點麻煩,在列表視圖(又名convertView) 所以這裏是我的代碼視圖緩存,Android的列表視圖緩存在初始化

private class CurrencyAdapter extends ArrayAdapter<CurrencyModel> { 
    Context ctx; 
    int layoutResourceId; 
    List<CurrencyModel> adapter_models = null; 

    public CurrencyAdapter(Context ctx, int layoutResourceId, 
      List<CurrencyModel> model) { 
     super(ctx, layoutResourceId, model); 
     this.ctx = ctx; 
     this.layoutResourceId = layoutResourceId; 
     adapter_models = model; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // TODO Auto-generated method stub 
     Log.d(Constants.APP_TAG, "position: " + position); 
     View row = convertView; 
     CurrencyAdapterContainer holder = null; 
     if (row == null) { 
      Log.d(Constants.APP_TAG, "APP NULL"); 
      row = ((Activity) ctx).getLayoutInflater().inflate(
        layoutResourceId, parent, false); 
      holder = new CurrencyAdapterContainer(); 
      holder.textView = (TextView) row 
        .findViewById(R.id.currencies_txt); 
      holder.imgView = (ImageView) row 
        .findViewById(R.id.currencies_flag_icon); 
      row.setTag(holder); 

     } else { 
      Log.d(Constants.APP_TAG, "APP NOT NULL"); 
      holder = (CurrencyAdapterContainer) row.getTag(); 
     } 

     CurrencyModel curr = getItem(position); 

     if (curr.currency_value == null) { 
      if (counter < MAX_COUNTER) { 
       ++counter; 
       CurrencyJsonDownloader cDownloader = new CurrencyJsonDownloader(
         curr, holder.textView); //download currency value in background, and set textview text if currency_value has been loaded in onpostExcecute (i'm using AsyncTask) 
       String url = CURRENCY_URL.replace("<symbol>", curr.symbol); 
       Log.d(Constants.APP_TAG, "Url currency: " + url); 
       cDownloader.execute(url); 
      } 
      holder.textView.setText(""); 
     } else { 
      holder.textView.setText(curr.currency_value); 
     } 
     holder.imgView.setImageResource(curr.drawableId); 

     return row; 
    } 

    @Override 
    public CurrencyModel getItem(int position) { 
     // TODO Auto-generated method stub 
     return adapter_models.get(position); 
    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return adapter_models.size(); 
    } 
} 

static class CurrencyAdapterContainer { 
    ImageView imgView; 
    TextView textView; 
} 

,這裏是我的logcat輸出

位置:0 APP NULL

位置:1 APP NOT NULL

位置:2 APP NOT NULL

位置:3 APP NOT NULL

。 。 。

位置:10 APP NOT NULL

,使一個災難,因爲這意味着被傳遞的後臺作業的TextView相同的TextView和改變的看法是相同的TextView和其他的TextView將有空白視圖,除非我滾動它當然再次調用getView()和一切都很好。但是,啓動應用程序時出現問題,因爲只有一個文本視圖始終更改其值。

爲什麼會發生這種情況?有什麼黑客我可以做嗎? 以前感謝...

回答

0

ListView項次被回收,所以不要抱到一個特定的項目視圖參考,並期望它的ListView已滾動後表示相同的數據。

將數據項傳遞給您的工作任務,讓它更新數據。

更新:

  • 如果您當前的產品關閉屏幕,它將從適配器請求( 時的ListView滾動它),並顯示更新的數據。
  • 如果當前正在顯示該項目,請在適配器上調用notifyDataSetChanged(),這將使ListView刷新其顯示的項目。
+0

作品像魅力:p,謝謝.. – euclid135

0

我認爲問題與您的列表適配器。在這裏我發佈了一個適配器類,我認爲它會幫助你。

public class UploadListAdaptor extends BaseAdapter { 
private Context context; 
private List<UploadDetailsObj> uploadList; 

public UploadListAdaptor(Context context, List<UploadDetailsObj> list) { 
    this.context = context; 
    uploadList = list; 

} 

public int getCount() { 
    return uploadList.size(); 
} 

public Object getItem(int position) { 
    return uploadList.get(position); 
} 

public long getItemId(int position) { 
    return position; 
} 

/** LIST CATEGORY */ 

public View getView(int position, View convertView, ViewGroup viewGroup) { 

    final UploadDetailsObj chlListObj = uploadList.get(position); 

    if (convertView == null) { 

     LayoutInflater inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = inflater 
       .inflate(R.layout.inflator_progress_bar, null); 

     TextView photoName = (TextView) convertView 
      .findViewById(R.id.tv_photoname); 

     Button btnProgress=(Button)convertView.findViewById(R.id.btn_progress); 
    photoName.setText(chlListObj.getPhotoName()); 




    } 


    return convertView; 

} 

    } 

您可以使用此代碼調用此適配器。

List<UploadDetailsObj> listofUploads= new ArrayList<UploadDetailsObj>(); 
UploadListAdaptor uploadListAdptr = new UploadListAdaptor(yourclass.this, 
      listofUploads); 

    uploadListView.setAdapter(uploadListAdptr); 
+0

我不認爲問題是與適配器,但我會嘗試它.. – euclid135