Android 为 ListActivity 在 AbsListView.obtainView 的 ListView 中崩溃
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/2307688/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Crash in ListView at AbsListView.obtainView for ListActivity
提问by Tim
I'm watching content updates on a ListActivity using a ContentObserver as follows:
我正在使用 ContentObserver 观看 ListActivity 上的内容更新,如下所示:
protected void onCreate(Bundle savedState)
{
super.onCreate(savedState);
ContentResolver cr = getContentResolver();
Cursor cursor = cr.query(TrackHeader.CONTENT_URI, sTrackListProjection, null, null, null);
startManagingCursor(cursor);
this.mAdapter = new TrackHeaderDataAdapter(this, R.layout.track_list_item, cursor, sTrackListProjection, null);
setListAdapter(mAdapter);
Handler handler = new Handler();
mTrackHeaderObserver = new ContentObserver(handler) {
@Override
public boolean deliverSelfNotifications() {
return false;
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
ContentResolver cr = getContentResolver();
mAdapter.changeCursor(cr.query(TrackHeader.CONTENT_URI, sTrackListProjection, null, null, null));
}
};
getContentResolver().registerContentObserver (TrackHeader.CONTENT_URI, true, mTrackHeaderObserver);
}
This content observer seems to be ok -- it gets called back on the UI thread but I am getting the following random crash pretty predictably on the underlying ListView:
这个内容观察者似乎没问题——它在 UI 线程上被回调,但我在底层 ListView 上可以预见到以下随机崩溃:
02-21 14:06:00.440: ERROR/AndroidRuntime(739): java.lang.NullPointerException
02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.widget.AbsListView.obtainView(AbsListView.java:1276)
02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.widget.ListView.makeAndAddView(ListView.java:1668)
02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.widget.ListView.fillDown(ListView.java:637)
02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.widget.ListView.fillSpecific(ListView.java:1224)
02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.widget.ListView.layoutChildren(ListView.java:1499)
02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.widget.AbsListView.onLayout(AbsListView.java:1113)
02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.view.View.layout(View.java:6830)
02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.view.View.layout(View.java:6830)
02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.view.View.layout(View.java:6830)
02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.view.View.layout(View.java:6830)
02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1119)
02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:998)
02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.widget.LinearLayout.onLayout(LinearLayout.java:918)
02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.view.View.layout(View.java:6830)
02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.view.View.layout(View.java:6830)
02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.view.View.layout(View.java:6830)
02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.view.View.layout(View.java:6830)
02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.view.ViewRoot.performTraversals(ViewRoot.java:996)
02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.view.ViewRoot.handleMessage(ViewRoot.java:1633)
02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.os.Handler.dispatchMessage(Handler.java:99)
02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.os.Looper.loop(Looper.java:123)
02-21 14:06:00.440: ERROR/AndroidRuntime(739): at android.app.ActivityThread.main(ActivityThread.java:4363)
02-21 14:06:00.440: ERROR/AndroidRuntime(739): at java.lang.reflect.Method.invokeNative(Native Method)
02-21 14:06:00.440: ERROR/AndroidRuntime(739): at java.lang.reflect.Method.invoke(Method.java:521)
02-21 14:06:00.440: ERROR/AndroidRuntime(739): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
02-21 14:06:00.440: ERROR/AndroidRuntime(739): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
02-21 14:06:00.440: ERROR/AndroidRuntime(739): at dalvik.system.NativeStart.main(Native Method)
02-21 14:09:56.159: ERROR/AndroidRuntime(749): ERROR: thread attach failed
02-21 14:09:59.480: ERROR/AndroidRuntime(760): ERROR: thread attach failed
02-21 14:12:19.449: ERROR/AndroidRuntime(778): ERROR: thread attach failed
02-21 14:12:22.779: ERROR/AndroidRuntime(789): ERROR: thread attach failed
02-21 14:12:26.479: ERROR/gralloc(51): [unregister] handle 0x3f13b8 still locked (state=40000001)
Anyone seen anything like this before -- been stumped on this one for a few days...
任何人以前都见过这样的东西——被这个东西难住了几天......
Tim
蒂姆
回答by jonny99
I had a similar stack trace and discovered that I was returning a null from my getView() method in certain cases.
我有一个类似的堆栈跟踪,发现在某些情况下我从我的 getView() 方法返回了一个空值。
回答by Skywalker
If you have a list and extend BaseAdapter or Adapter to get a custom list, make sure that getView returns a non-null value.
如果您有一个列表并扩展 BaseAdapter 或 Adapter 以获取自定义列表,请确保 getView 返回非空值。
If you have a tabbed view and one of your fragment is a list that override Adapter/BaseAdapter and getView returns null you will get this problem.
如果您有一个选项卡式视图,并且您的片段之一是覆盖 Adapter/BaseAdapter 并且 getView 返回 null 的列表,您将遇到此问题。
回答by Merve Gencer
If you are using a static class ViewHolder to store your view items in the adapter, you may forgot to set the viewHolder object as the tag of the convertView. E.g:
如果您使用静态类 ViewHolder 在适配器中存储您的视图项,您可能忘记将 viewHolder 对象设置为 convertView 的标签。例如:
if (convertView == null) {
LayoutInflater mInflater = (LayoutInflater) context
.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
convertView = mInflater.inflate(R.layout.adapter_drivers_and_riders, null);
holder = new ViewHolder();
holder.tvDate = (TextView)convertView.findViewById(R.id.tvDate);
holder.tvTime = (TextView)convertView.findViewById(R.id.tvTime);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
In my case, I was not using a Cursor but having the same issue, I figured it out that i forgot to set the tag as viewHolder to convertView so when the first adapter views are created for the listview, it is ok but when you scroll and recycling mechanism works, it crashes since it can't restore the viewHolder from convertView.
就我而言,我没有使用 Cursor 但遇到了同样的问题,我发现我忘记将标签设置为 viewHolder 到 convertView 所以当为列表视图创建第一个适配器视图时,没问题,但是当你滚动时并且回收机制有效,它崩溃了,因为它无法从 convertView 恢复 viewHolder。
Just in case, I wanted to mention.
以防万一,我想提一下。
回答by CommonsWare
I have not used changeCursor()
. And, since the query you used to create the Cursor
is the same as the query you are using to "change" the cursor, I'd dump the changeCursor()
call outright and just call requery()
on the Cursor
you have.
我没用过changeCursor()
。而且,因为查询用于创建的Cursor
是一样的,你使用的是“变”游标的查询,我会转储changeCursor()
直接通话,只是叫requery()
上Cursor
你。