Может ли кто-нибудь объяснить мне, откуда возникает следующая проблема:
У меня есть список, который отображает несколько элементов в соответствии с некоторыми предпочтениями. Пользователь может изменить эти настройки через 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 в адаптере.
Хмммм, от чего простирается ваш пользовательский адаптер? Вероятно, вы не обновляете тот же массив/список, из которого размер getCount()
получает свой размер. Или, может быть, есть еще одна проблема с вашей реализацией getCount()
. Я нашел на практике, что самый безопасный способ правильно работать с адаптером - это просто перейти от BaseAdapter
и заполнить любой из методов, которые просит компилятор.
Кстати, вам не нужно получать адаптер через список (так как он так же, как adapter
, надеюсь), так что вы можете сделать adapter.notifyDatasetChanged()
напрямую.
Если это не решит вашу проблему, рассмотрите размещение кода адаптера.
getCount()
основан на исходном размере массива, с которым вы инициализировали адаптер (см. Здесь ), вы можете переопределить его, но, как я уже сказал, будет проще, если вы просто продолжите работу сBaseAdapter
.