2012-05-18 3 views
5

Ho 4 TextViews, 2 ImageViews, 2 Buttons e 2 widget che fanno parte di una definizione di riga in un ListView. I dati provengono da XML e da SimpleAdapter. Per accedere a questi TextViews implementare lo ViewBinde r in una classe personalizzata e sovrascrivere lo setViewValue. Funziona e le due TextViews che voglio cambiare dinamicamente sono gestite nello setViewValue. Ciò che mi confonde è il motivo per cui le altre due TextView non vengono passate attraverso setViewValue. Dico questo in base all'impostazione di un punto di interruzione in cui il thread di esecuzione viene inserito solo due volte. Mi aspettavo di vederlo 4 o più volte?Migliore comprensione di ViewBinder di SimpleAdapter

Ecco lo setViewValue dove ho impostato un punto di interruzione.

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

dichiarazione XML dei TextViews (1 spettacoli e 4 non lo fa):

<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" /> 

Quindi, in sintesi Perché l'esecuzione immettere l'override solo due volte e si dà il caso ad essere l'esatto due voglio aggiornare?

Bene attraverso ulteriori letture e ragionamenti deduttivi sono venute alla luce alcune altre informazioni. Nella mia mente, mai Vista nell'Xriga XML passerebbe attraverso il ViewBinder ma che era SBAGLIATO! Da quello che riesco a capire si collega il ViewBinder al DataAdapter tramite setViewBinder. Bene visto che al DataAdapter viene detto quale View da utilizzare per popolare i dati in esso contenuti, è logico che siano visualizzati solo i due. Ne stavo solo rivelando due.

Ecco un frammento in cui ho specificare le viste coinvolte nel processo di popolamento e passarle sul costruttore di DataAdapter:

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

Anche se questo sembra avere senso non so che il mio ragionamento deduttivo è preciso Aggiornerà man mano che trovo più informazioni.

risposta

5

Se si imposta un ViewBinder su SimpleAdaptertutto il Views avete dichiarato (nel to matrice nel tuo caso) verrà passato al metodo s' il ViewBindersetViewValue() non importa quale. Se il metodo setViewValue non restituisce true significa che l'associazione dati per quello View non è riuscita (per qualsiasi motivo), quindi si ottiene l'azione predefinita (per un TextView), l'impostazione del testo dai dati Hashmap. In questo momento hai dichiarato lo setViewValue di fare qualcosa per solo due TextViews (controllando i loro id) e anche di restituire truenon importa quale sia. Quando inserirai lo Views nel tuo layout di riga per l'altro Views, inserirai nuovamente lo setViewValue, non corrisponderai agli ID (quindi nessun aggiornamento per quelli Views) e restituirai true (che dirà all'adattatore che il binding era riuscito e questo View non richiede altro lavoro). A look at the source code per il metodo SimpleAdapter.bindView mostrerà come viene utilizzato il ViewBinder.

Inoltre, vedo che si utilizza un adattatore personalizzato, sei sicuro di non interferire con la normale logica ?(inoltre, non utilizzare lo stesso nome per la classe e il nome della variabile)

+0

Roger per nominare la classe e la variabile lo stesso. Hai ragione e stavo digitando velocemente per la pubblicazione. Per quanto riguarda il true return, capisco cosa stai dicendo restituendo SEMPRE true da setViewValue. Sto guardando il link fornito ora per trovare un modo migliore per tornare da setViewValue in modo che sia preciso non solo hardcoded. – GPGVM

+1

Amico, è fantastico. Non sapevo che potevi dare un'occhiata al codice sorgente in quel modo. Doppio grazie – GPGVM