Actualizaciones de datos de Android ListView ArrayAdapter Mejores prácticas

Tengo una actividad con varias vistas de lista que reciben continuamente nuevos valores forman un hilo de socket, otro hilo analiza los datos y actualiza los adaptadores de matriz, luego el hilo de ui llama a notifyDataSetChanged () para hacer que la lista se actualice.

Mi problema es que estoy refrescando toda la lista un par de veces por segundo, esto hace que la interfaz de usuario sea muy laggy cuando algunas animaciones necesitan suceder.

Me preguntaba cuál es la mejor manera de actualizar listas múltiples con múltiples cambios de valor cada segundo?

Gracias, Totem.

Definitivamente, seguiría las directrices que dieron en Google IO este año.

Video de la lista de reproducción de Google IO

Debería utilizar Cursores (si es necesario) y ListActivity. La interfaz de usuario se actualiza automáticamente tan pronto como hay cambios y en el caso de conjuntos de datos nulos, la lista muestra automáticamente una vista relevante.

Los siguientes ejemplos lo resuelven usando proveedores de contenido:

Main.xml:

<ListView android:id="@id/android:list" android:layout_width="fill_parent" android:layout_height="wrap_content"></ListView> <TextView android:id="@id/android:empty" android:layout_width="fill_parent" android:gravity="center" android:layout_height="wrap_content" android:text="No data, please refresh!" /> 

Observe el android: lista y android: etiquetas vacías. Estos son requeridos por la actividad de la lista.

En el método onCreate ():

 mCursor = getContentResolver().query(SOME_URI, null, null, null, null); ListView mListView = (ListView) findViewById(android.R.id.list); mListView.setAdapter(new CustomCusorAdapter(getApplicationContext(), mCursor)); 

Puede utilizar un SimpleCursorAdapter si sus vistas son directas. He creado por propio adaptador debido a las vistas complejas:

 private class CustomCusorAdapter extends CursorAdapter { public CustomCusorAdapter(Context context, Cursor c) { super(context, c); } @Override public void bindView(View view, Context context, Cursor cursor) { Holder holder = (Holder) view.getTag(); holder.tv.setText(cursor.getString(cursor .getColumnIndex(COL1_NAME))); } @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { View v = getLayoutInflater().inflate( R.layout.layout_xml, null); Holder holder = new Holder(); holder.tv = (TextView) v .findViewById(R.id.tv); holder.cb= (CheckBox) v .findViewById(R.id.cb); v.setTag(holder); return v; } } private class Holder { TextView tv; CheckBox cb; } 

Sí, ese video es muy útil. Uno de los más grandes llevar aways es que debe reciclar el convertido pasó a su lista de adaptadores método getView:

  public View getView(int position, View convertView, ViewGroup parent){ if (convertView == null) { convertView = mInflator.inflate(resource, parent, false); } //do any view bindings for the row return convertView; } 

El otro pedacito útil era utilizar una clase de ViewHolder para el reciclaje de la visión. Está a las 10:30 en el video.

  • ¿Cómo implementar correctamente un listview personalizado con imágenes usando la biblioteca de Picasso?
  • Listview recarga las imágenes ya cargadas mediante el cargador de imágenes Universal
  • Android cómo modificar EditText editable dentro de un ListView
  • Android ==> ListView quedarse seleccionado?
  • Cómo rellenar JSON desde este enlace a Android Listview
  • Android TextView Problema de enfoque en listview (sólo MarshMallow)
  • Android looping infinito ListView?
  • Eliminar el encabezado de listView
  • Animar elementos de la lista en ListView
  • Agregar un encabezado / pie de página en un listview en xml
  • Animar cada elemento de ListView al mostrar
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.