notifyDataSetChanged сбой приложения

1

Может ли кто-нибудь объяснить мне, откуда возникает следующая проблема:

У меня есть список, который отображает несколько элементов в соответствии с некоторыми предпочтениями. Пользователь может изменить эти настройки через 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 в адаптере.

Теги:

1 ответ

2
Лучший ответ

Хмммм, от чего простирается ваш пользовательский адаптер? Вероятно, вы не обновляете тот же массив/список, из которого размер getCount() получает свой размер. Или, может быть, есть еще одна проблема с вашей реализацией getCount(). Я нашел на практике, что самый безопасный способ правильно работать с адаптером - это просто перейти от BaseAdapter и заполнить любой из методов, которые просит компилятор.

Кстати, вам не нужно получать адаптер через список (так как он так же, как adapter, надеюсь), так что вы можете сделать adapter.notifyDatasetChanged() напрямую.

Если это не решит вашу проблему, рассмотрите размещение кода адаптера.

  • 0
    Я добавил код для моего адаптера
  • 0
    Да, как я и подозревал. Проблема заключается в том, что метод getCount() основан на исходном размере массива, с которым вы инициализировали адаптер (см. Здесь ), вы можете переопределить его, но, как я уже сказал, будет проще, если вы просто продолжите работу с BaseAdapter .
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню