2012-05-18 12 views
5

Mam 4 TextViews, 2 ImageViews, 2 Buttons i 2 widżety, które są częścią definicji wiersza w ListView. Dane pochodzą z XML i SimpleAdapter. Aby uzyskać dostęp do tych TextViews, implementuję ViewBinde rw klasie niestandardowej i zastępuję setViewValue. To działa i dwie zmiany, które chcę dynamicznie zmieniać, są obsługiwane w setViewValue. To, co jest dla mnie mylące, to to, dlaczego moje dwa pozostałe okna TextView nie przechodzą przez setViewValue. Mówię to na podstawie ustawienia punktu przerwania, w którym wątek wykonania wchodzi tylko dwa razy. Spodziewałem się zobaczyć to 4 lub więcej razy?Lepsze zrozumienie ViewBinder SimpleAdaptera

Oto setViewValue, gdzie mam zestaw punktów przerwań.

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

deklaracja xml z TextViews (1 pokazach i 4 nie):

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

Tak w skrócie dlaczego wykonanie wprowadzić nadpisanie tylko dwa razy i to tylko tak się składa, że ​​dokładna dwa chcę zaktualizować?

Cóż przez dodatkowe czytanie i dedukcyjne rozumowanie wyszło na jaw kilka dodatkowych informacji. W moim wyobrażeniu, kiedykolwiek wiersz ListView XML przejdzie przez ViewBinder, ale to było NIEPRAWDZIWE! Z tego co mogę sobie wyobrazić, dołączasz ViewBinder do DataAdapter przez setViewBinder. Cóż, odkąd DataAdapter jest informowany o tym, jakich widoków użyć do zapełnienia danych, ma sens, że pokazywały się tylko te dwie. Dowiedziałem się tylko dwóch.

Oto fragment gdzie mogę określić widoków zaangażowanych w proces wypełniania i przekazywania ich konstruktora 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); 

Choć to wydaje się mieć sens nie wiem, że moje rozumowanie dedukcyjne Jest dokładna. Aktualizacja zostanie zaktualizowana, gdy znajdę więcej informacji.

Odpowiedz

5

Jeśli ustawić ViewBinder na SimpleAdapterwszystkoViews ty oświadczył (w tablicy w Twoim przypadku to) zostaną przekazane do setViewValue() metodzie ViewBinder „s nie wiem co. Jeśli metoda setViewValue nie zwróci true, co oznacza, że ​​powiązanie danych dla tego View nie powiodło się (z jakiegokolwiek powodu), wówczas otrzymasz domyślną akcję (dla TextView), ustawiając tekst z danych Hashmap. Teraz zadeklarowałeś setViewValue zrobić coś tylko dla dwóch TextViews (sprawdzanie przez ich identyfikatory), a także zwrócić truebez względu na to, co. Po wprowadzeniu setViewValue dla innego Views w layoucie wiersza ponownie wprowadzisz setViewValue, nie dopasowujesz identyfikatorów (więc nie ma aktualizacji dla tych Views) i zwróć true (co powie adapterowi, że powiązanie było udana i ta View nie wymaga więcej pracy). A look at the source code dla metody SimpleAdapter.bindView pokaże, w jaki sposób jest używany ViewBinder.

Widzę również, że używasz niestandardowej karty, czy na pewno nie zakłócasz normalnej logiki SimpleAdapter?(nie używaj również tej samej nazwy dla nazwy klasy i zmiennej)

+0

Nazywanie klasy i zmiennej tym samym. Masz rację i właśnie pisałam szybko, by opublikować. Jeśli chodzi o zwracanie wartości true, rozumiem, co mówisz, ZAWSZE zwracając wartość true z setViewValue. Czekam na link podany teraz, aby znaleźć lepszy sposób na powrót z setViewValue, więc jest dokładny nie tylko na stałe. – GPGVM

+1

Koleś, który jest niesamowity. Nie wiedziałem, że możesz zajrzeć do kodu źródłowego w ten sposób. Podwójnie dziękuję. – GPGVM