notifyDataSetChanged使应用程序崩溃

时间:2011-05-30 22:03:35

标签: android

有人可以解释一下以下问题的来源:

我有一个列表,根据某些偏好显示几个项目。用户可以通过SlidingDrawer更改这些首选项。每当发生这种情况时,我会获得与新首选项对应的项目,然后我将结果设置为使用下面的代码支持listview的适配器。

 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。

1 个答案:

答案 0 :(得分:2)

嗯,您的自定义适配器是从哪个扩展出来的?您可能没有更新getCount()获取其大小的相同数组/列表。或者您的getCount()实施可能存在另一个问题。我通过实践发现,使适配器正常工作的最安全方法是从BaseAdapter扩展并填写编译器要求的任何方法。

顺便说一下,您不必通过列表获取适配器(因为它与adapter相同,希望如此),因此您可以直接执行adapter.notifyDatasetChanged()

如果这不能解决您的问题,请考虑发布您的适配器代码。