android - notifyDataSetChanged 使应用程序崩溃

标签 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。

最佳答案

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

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

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

关于android - notifyDataSetChanged 使应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6181107/

相关文章:

android - 为什么更新一个android应用程序可以让它出现两次?

android - 在 Android 中更改 ProgressBar fps

java - 从 onClickListener 调用新方法时返回 Null

android - Aviary SDK 图片编辑器运行报错

android - BroadcastReceiver - onReceive 未被调用

android - LibGDX 样板代码 NullPointerException

java - 错误 'Didn' t 在路径 : DexPathList' 上找到类

android - 在操作栏的 searchView 上进行实时搜索

android - 将数组列表转换为数组

java - 将倒计时设置为当前时间后 4 小时[应用程序无法正常工作]