这个问题通常发生在使用SimpleAdapter时,因为当调用finish()方法时会触发ListView重新绘制,在这个过程中,SimpleAdapter的getView()方法可能会在onStop或onDestroy之前被调用,导致崩溃。
一种解决方法是在调用finish()方法之前,先调用ListView的setAdapter(null)方法,以清除Adapter并防止调用getView()方法。示例代码如下:
ListView listView = findViewById(R.id.list_view);
listView.setAdapter(null);
finish();
还有一种解决方法是继承SimpleAdapter并覆盖其getView()方法,在方法中添加必要的检查以避免崩溃。示例代码如下:
public class MyAdapter extends SimpleAdapter {
public MyAdapter(Context context, List extends Map> data, int resource, String[] from, int[] to) {
super(context, data, resource, from, to);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
try {
return super.getView(position, convertView, parent);
} catch (IllegalStateException e) {
// Ignore this exception
return new View(getContext());
}
}
}
使用这个自定义Adapter时,需要将SimpleAdapter替换为MyAdapter,如下所示:
ListView listView = findViewById(R.id.list_view);
MyAdapter adapter = new MyAdapter(this, data, R.layout.item_layout, from, to);
listView.setAdapter(adapter);
这样,在调用finish()方法之后,SimpleAdapter的getView()方法就不会再被调用了,也就避免了崩溃。
上一篇:Android-调用ContentResolver.insert()返回Uri后使用openFileDescriptor时出现FileNotFoundException。
下一篇:Android-底部有空白间隙