2011-05-30 40 views
1

有人可以解釋我在哪裏下面的問題來自:notifyDataSetChanged崩潰的應用程序

我有一個列表,根據一些喜好顯示幾個項目。用戶可以通過SlidingDrawer更改這些首選項。每當發生這種情況時,我會得到與新的首選項對應的項目,然後將結果設置爲支持下面代碼的支持列表視圖的適配器。

public void update(final List<Report> reports) 
{ 
     adapter.setReports(reports); 
     ((ArrayAdapter)list.getAdapter()).notifyDataSetChanged(); 
     list.invalidate(); 
} 

這裏的適配器類

public class ReportsAdapter extends ArrayAdapter<Report> 
{ 
    List<Report> reports; 
    Activity context; 

    public void setReports(List<Report> reports) 
    { 
     this.reports = reports; 
    } 

    ReportsAdapter(Activity context, List<Report> reports) 
    { 
     super(context, R.layout.row_report, R.id.report_timestamp,reports) ; 

     this.reports = reports; 
     this.context = context; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) 
    { 
     View row = context.getLayoutInflater().inflate(R.layout.row_report, null); 

     TextView timestamp = (TextView)row.findViewById(R.id.report_timestamp); 
     if(timestamp != null) 
      timestamp.setText("Timestamp: "+reports.get(position).getTimestamp()); 

     TextView type = (TextView)row.findViewById(R.id.report_type); 
     if(type != null) 
      type.setText("Type: "+reports.get(position).getReportType().getType().toString()); 

     TextView status = (TextView)row.findViewById(R.id.report_status); 
     if(status != null) 
      status.setText("Status: "+reports.get(position).getStatus()); 

     ImageView icon = (ImageView)row.findViewById(R.id.report_icon); 
     if(icon != null && reports.get(position).getReportType().getType()!= ReportType.RType.DEFAULT) 
     { 
      Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), reports.get(position).getIconResource()); 
      if(bitmap != null) 
      { 
       icon.setImageBitmap(bitmap); 
      } 
     }   
     return row; 
    } 
} 

與適配器的ArrayOutOfBoundsException應用程序崩潰後。

回答

2

嗯,你的自定義適配器從什麼擴展?您可能沒有更新getCount()正在獲取其大小的相同陣列/列表。或者你的getCount()實現還有其他問題。我通過實踐發現,使適配器正常工作的最安全方法是從BaseAdapter擴展並填寫編譯器要求您提供的任何方法。順便提一句,你不必通過列表獲取適配器(因爲它與adapter相同),所以你可以直接執行adapter.notifyDatasetChanged()

如果這不能解決您的問題,請考慮發佈您的適配器代碼。

+0

我添加了自定義適配器的代碼 – steve 2011-05-30 22:13:43

+0

是的,正如我懷疑的那樣。問題是'getCount()'是基於你初始化適配器的數組的*原始*大小(參見[這裏](http://www.netmite.com/android/mydroid/1.5/frameworks/) base/core/java/android/widget/ArrayAdapter.java)),你可以覆蓋它,但正如我所說,如果你只是從'BaseAdapter'擴展,就會更容易。 – dmon 2011-05-30 22:20:02

+0

是的,我看到在初始化後,對支持數據的內部引用永遠不會被修改 – steve 2011-05-30 22:27:27