2010-10-28 10 views
13

Tengo una actividad secundaria que contiene un ListView. Esta actividad se completa de forma asincrónica desde un cursor SQLite. Los elementos de la lista contienen un TextView, un RadioButton y un botón normal. El XML se muestra a continuación:Cómo saber cuándo se completa una vista de lista de Android

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout android:id="@+id/rlCategoryListItemLayout" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content"> 
<TextView android:id="@+id/tvCategoryListItemTitle" style="@style/uwLargeListItemLabelStyle" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_centerVertical="true" android:singleLine="true" android:text="This is a test note title" /> 
<LinearLayout android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_alignParentRight="true" android:gravity="center_vertical"> 
    <RadioButton android:id="@+id/rdoCategoryListItemSelect" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginRight="10dip" /> 
    <Button android:id="@+id/btnCategoryListItemDelete" android:background="@drawable/delete_red" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" /> 
</LinearLayout> 
</RelativeLayout> 

tengo que hacer algo de lógica para determinar qué RadioButton está seleccionado por defecto, y no puede hacerlo hasta que la ListView ya está cargado. El problema es que con todos los eventos que he intentado hasta ahora (onCreate, onPostCreate, onResume, onWindowFocusChanged), el conteo de niños de ListView es cero. También intenté usar el método getView en la clase ArrayAdapter, pero ese método se denomina múltiplos veces y el recuento de elementos secundarios de ListView es potencialmente diferente cada vez, lo que genera resultados inesperados. Aparentemente, estos eventos se inician antes de que ListView haya terminado de completarse completamente con sus elementos secundarios.

¿Hay algún evento que pueda escuchar, o de alguna otra manera, para determinar cuándo ListView ha terminado de completarse y tiene todos sus elementos accesibles para ser modificados mediante programación?

¡Gracias!

Respuesta

1

Un ListView no crea realmente una vista para cada elemento en la lista de datos que está representando. En cambio, recicla las vistas para ser receptivo y no la memoria de cerdo. Puede replantearse lo que realmente necesita cuando dice que ListView necesita ser llenado.

Puede ser útil si profundiza un poco más sobre su aplicación y publica algún código.

+1

Gracias, elevine. Solo tengo que seleccionar uno de los RadioButton por defecto. Sin embargo, cuando trato de hacer eso, el ListView no parece tener elementos secundarios todavía. Entonces, necesito saber cuándo ListView está completamente lleno para poder entrar y seleccionar uno de los elementos de la lista. – mahdaeng

+0

Mi punto es lo que quiere decir con "ListView está lleno" no está claro. Si con eso quiere decir que todos los elementos de la lista son visibles, es posible que esa condición nunca suceda debido a la forma en que ListView representa las filas. – elevine

+0

Sí, eso es exactamente lo que quiero decir. :^( – mahdaeng

2

Al final de su trabajo asincrónico en la base de datos, puede usar Handler.post (Runnable) para ejecutar el código nuevamente en el hilo principal. Es casi como desencadenar una devolución de llamada y puede garantizar que se ejecutará después de que se rellene la lista. Incluso puede programar Runnable para que ocurra en un momento determinado más adelante si necesita programar todo cuidadosamente.

¿Le sirvió de algo?

+0

Gracias, mtmurdock. Probaré algunas cosas allí y veré qué puedo obtener. Informaré sobre mis resultados. – mahdaeng

+0

Otra opción en esa línea es usar AsyncTask: http: // developer .android.com/reference/android/os/AsyncTask.html – elevine

+0

Al final resultó que tenía un error sutil en otra parte de mi código. Aparentemente, estaba desconectando mi Runnable exactamente cuando debería haber estado, pero el otro error era haciendo que parezca que ciertos controles aún no estaban listos. Gracias, mtmurdock y elevine, por su buena disposición para ayudarme con esto. – mahdaeng

0

Puede añadir una variable de cadena en su actividad (por ejemplo public static String END_LOAD) y establecer el valor en su método getView (en el adaptador), y luego en su actividad, después de

ListView listView = (ListView) findViewById(R.id.recordListView); 
     listView.setAdapter(adapter); 

Se puede añadir un simple hilo que será comprobar la variable END_LOAD:

Runnable runnable = new Runnable() { 
    @Override 
    public void run() { 
     while (END_LOAD == null || END_LOAD .equals("")) { // your conditions 
     } 
     createReadRequest(); // your task to execute 
    } 
}; 

new Thread(runnable).start(); 

agregar una condición simple que puede ser interesante para usted, a continuación, cuando la condición será falsa es porque se lleva a cabo el método getView, ahora usted puede hacer su proceso específico.

+0

¿Qué es END_LOAD? ¿Y cómo puedo obtenerlo? –

6

Puede utilizar un manejador para realizar esta tarea, así:

En su actividad de agregar el controlador como cualquier otra propiedad.

private Handler mListViewDidLoadHanlder = new Handler(new Handler.Callback() { 
    @Override 
    public boolean handleMessage(Message message) { 
     //Do whatever you need here the listview is loaded 
     return false; 
    } 
}); 

Y dentro del método getView de su adaptador de vista de lista lo hace la comparación para ver si la posición actual es la última, así, se va a terminar (sólo hay que poner antes del regreso):

public View getView(int position, View convertView, ViewGroup parent) { 
     //Your views logic here 

     if (position == mObjects.size() - 1) { 
       mViewDidLoadHanlder.sendEmptyMessage(0); 
      } 

     return convertView; 
    } 
+4

El tamaño de sus datos (mObjetos) no se correlaciona con el número real que se muestra en getView. – AndroidDev

+0

No hay 'getView (' en mi 'ListView.java'; ¿dónde exactamente está ese método? – msysmilu

+0

Tiene razón, esto está en su adaptador. Http://developer.android.com/reference/android/widget/ArrayAdapter .html # getView (int, android.view.View, android.view.ViewGroup) –

Cuestiones relacionadas