ListView crashes in AbsListView.obtainView for ListActivity

I am viewing content updates in ListActivity using ContentObserver as follows:

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 looks fine - it returns to the user interface stream, but I get the following random crash pretty predictable in the underlying 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 who has seen something like this before was this time for a few days ...

Tim

+55
android listview
Feb 21 '10 at 22:21
source share
4 answers

I had a similar stack trace, and I found that in some cases I was returning null from my getView () method.

+227
Oct 15 '10 at 17:21
source share

If you have a list and extend the BaseAdapter or Adapter to get your own list, make sure getView returns a non-zero value.

If you have a tab and one of your snippets is a list that overrides Adapter / BaseAdapter and getView returns null, you will get this problem.

+10
Mar 09 '14 at 10:30
source share

If you use the static ViewHolder class to store view elements in the adapter, you may forget to set the viewHolder object as a convertView tag. For example:

 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 did not use the cursor, but had the same problem, I realized that I forgot to set the tag as viewHolder to convert the View, so when the first adapter views are created for the list, this is normal, but when you execute the scroll and recirculation mechanism, it fails since it cannot restore viewHolder from convertView.

Just in case, I would like to mention.

+4
Mar 26 '14 at 12:05
source share

I have not used changeCursor() . And since the query that you used to create the Cursor is the same as the query that you use to β€œchange” the cursor, I would drop the changeCursor() call directly and just call requery() on Cursor you have.

+3
Feb 22 '10 at 0:21
source share



All Articles