开发者

notifyDataSetChanged crashing the application

Could someone explain me where the following problem is coming from:

I have a list that displays several items according to some preferences . The user can change these preferences through a SlidingDrawer . Whenever this happens I get the items corresponding to the new preferences and then I the set the result to the adapter backing the listview with the code below.

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

Here's the adapter class

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);
        i开发者_开发百科f(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;
    }
}

After that the application crashes with an ArrayOutOfBoundsException in the adapter.


Hmmmm what does your custom Adapter extend from? You're probably not updating the same Array/List that the getCount() is getting its size from. Or maybe there's another problem with your getCount() implementation. I've found through practice that the safest way to get an Adapter working properly is to just extend from BaseAdapter and fill in any of the methods that the compiler asks you to.

Incidentally, you don't have to get the adapter through the list (since it's the same as adapter, hopefully), so you can do adapter.notifyDatasetChanged() directly.

If this doesn't solve your problem, consider posting your adapter code.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜