tutorial studio recyclerview llenar custom como agregar activity android listview

studio - llenar un listview android



Bloquear en ListView en AbsListView.obtainView para ListActivity (4)

Estoy viendo actualizaciones de contenido en una ListActivity usando ContentObserver de la siguiente manera:

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); }

Este observador de contenido parece estar bien, se vuelve a llamar en el hilo de la interfaz de usuario, pero estoy obteniendo el siguiente bloqueo aleatorio de forma bastante predecible en el ListView subyacente:

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)

Alguien ha visto algo como esto antes: ha estado perplejo en este durante unos días ...

Tim


No he usado changeCursor() . Y, dado que la consulta que usaste para crear el Cursor es la misma que la consulta que estás usando para "cambiar" el cursor, changeCursor() llamada a changeCursor() directamente y simplemente llames a requery() en el Cursor que tienes.


Si está utilizando una clase estática ViewHolder para almacenar sus elementos de vista en el adaptador, puede olvidarse configurar el objeto viewHolder como la etiqueta de convertView. P.ej:

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(); }

En mi caso, no estaba usando un Cursor pero teniendo el mismo problema, me di cuenta de que olvidé configurar la etiqueta como viewHolder para convertirView, así que cuando se crean las primeras vistas del adaptador para la vista de lista, está bien, pero cuando se desplaza y el mecanismo de reciclaje funciona, se bloquea porque no puede restaurar viewHolder desde convertView.

Por las dudas, quería mencionarlo.


Si tiene una lista y extiende BaseAdapter o Adapter para obtener una lista personalizada, asegúrese de que getView devuelva un valor no nulo.

Si tiene una vista con pestañas y uno de sus fragmentos es una lista que anula Adapter / BaseAdapter y getView devuelve null obtendrá este problema.


Tenía un rastro de pila similar y descubrí que estaba devolviendo un nulo de mi método getView () en ciertos casos.