有人可以解释一下以下问题的来源:
我有一个列表,根据某些偏好显示几个项目。用户可以通过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。
答案 0 :(得分:2)
嗯,您的自定义适配器是从哪个扩展出来的?您可能没有更新getCount()
获取其大小的相同数组/列表。或者您的getCount()
实施可能存在另一个问题。我通过实践发现,使适配器正常工作的最安全方法是从BaseAdapter
扩展并填写编译器要求的任何方法。
顺便说一下,您不必通过列表获取适配器(因为它与adapter
相同,希望如此),因此您可以直接执行adapter.notifyDatasetChanged()
。
如果这不能解决您的问题,请考虑发布您的适配器代码。