2012-05-18 21 views
5

Tengo 4 TextViews, 2 ImageViews, 2 Buttons y 2 widgets que forman parte de una definición de fila en ListView. Los datos provienen de XML y un SimpleAdapter. Para acceder a estos TextViews implemento el ViewBinde r en una clase personalizada y anulo el setViewValue. Esto funciona y los dos TextViews que deseo cambiar dinámicamente se manejan en el setViewValue. Lo que me confunde es por qué mis otros dos TextViews no se pasan por setViewValue. Lo digo basándome en establecer un punto de interrupción donde el hilo de ejecución solo ingresa dos veces. Esperaba verlo 4 o más veces?Mejor comprensión de la ViewBinder de SimpleAdapter

Aquí está el setViewValue donde tengo un conjunto de puntos de interrupción.

@Override  
public boolean setViewValue(View view, Object data, String text) 
{ 
    if(view.getId() == R.id.txtvw1) 
    {    
//blah do some stuff 
    } 
    else if (view.getId() == R.id.txtvw2) 
    { 
//Blah do some stuff 
    } 

    return true; 
} 

declaración XML de los TextViews (1 muestra y 4 no lo hace):

<TextView 
     android:id="@+id/txtvw1" 
     android:layout_centerHorizontal="true" 
     android:layout_width="185dp" 
     android:layout_height="25dp" 
     android:textSize="20sp" 
     android:layout_marginTop="60dp" 
     android:gravity="center" 
     android:inputType="none" 
     android:text="@string/str_StaticA" 
     android:textColor="#C0F700" /> 

    <TextView 
     android:id="@+id/txtvw4" 
     android:layout_alignParentLeft="true" 
     android:layout_marginLeft="35dp" 
     android:layout_width="95dp" 
     android:layout_height="50dp" 
     android:textSize="18dp" 
     android:layout_marginTop="110dp" 
     android:gravity="center" 
     android:inputType="none" 
     android:text="IMHO:" 
     android:textColor="#FFBA19" /> 

Así que en resumen ¿Por qué la ejecución introduzca la anulación sólo dos veces Y da la casualidad de ser la exacta dos quiero actualizar?

Bueno a través de la lectura adicional y el razonamiento deductivo han salido a la luz algunas informaciones más. En mi opinión, nunca Ver en el ListView fila XML pasaría por el ViewBinder pero que estaba equivocado! Por lo que puedo imaginar, adjunte el ViewBinder al DataAdapter a través del setViewBinder. Bien, dado que se le dice a DataAdapter qué vista (s) usar para poblar los datos, tiene sentido que solo se muestren los dos. Solo estaba revelando dos.

Aquí hay un fragmento en el que especifique las Vistas que participan en el proceso de poblamiento y pasarlos al constructor del adaptador de datos:

String[] from = new String[] {"txtvw_PrevLift", "txtvw_PrevReps", "ActuLiftPikr", "ActulRepsPikr" }; 
int[] to = {R.id.txtvw_PrevLift, R.id.txtvw_PrevReps, R.id.ActuLiftPikr, R.id.ActulRepsPikr }; 

LiftDataAdapter LiftDataAdapter = new LiftDataAdapter(this, LiftDataMaps, R.layout.liftdatalayout, from, to); 

Si bien esto parece tener sentido que no sé que mi razonamiento deductivo es preciso. Se actualizará a medida que encuentre más información.

Respuesta

5

Si establece un ViewBinder en SimpleAdaptertoda laViews que declaró (en la matriz to en su caso) se pasará a setViewValue() método de la ViewBinder 's no importa qué. Si el método setViewValue no devuelve true, significa que el enlace de datos para ese View ha fallado (por alguna razón), entonces obtiene la acción predeterminada (para un TextView), estableciendo el texto a partir de los datos Hashmap. En este momento, declaró el setViewValue para hacer algo solo por dos TextViews (comprobando por sus ids) y también para devolver truesin importar qué. Cuando ingrese el setViewValue para el otro Views en el diseño de su fila, ingresará nuevamente el setViewValue, no coincide con los ID (así que no hay actualizaciones para esos Views) y devuelva true (que le indicará al adaptador que el enlace fue exitoso y este View no requiere más trabajo). A look at the source code para el método SimpleAdapter.bindView le mostrará cómo se usa ViewBinder.

Además, veo que usa un adaptador personalizado, ¿está seguro de que no interfiere con la lógica normal de SimpleAdapter?(tampoco utilice el mismo nombre para la clase y el nombre de la variable)

+0

Roger al nombrar la clase y la variable de la misma manera. Estás en lo correcto y solo tecleé rápido para la publicación. En cuanto a la devolución verdadera, entiendo lo que dices SIEMPRE devuelve verdadero de setViewValue. Estoy mirando el enlace provisto ahora para encontrar una manera mejor de regresar de setViewValue, por lo que es preciso no solo codificado. – GPGVM

+1

Tío que es increíble. No sabía que pudieras echarle un vistazo al código fuente así. Gracias doble. – GPGVM