2012-05-18 9 views
5

Ich habe 4 TextViews, 2 ImageViews, 2 Buttons und 2 Widgets, die Teil einer Zeile Definition in einem ListView sind. Die Daten stammen von XML und SimpleAdapter. Um auf diese TextViews zuzugreifen, implementiere ich die ViewBinde r in einer benutzerdefinierten Klasse und überschreiben Sie die setViewValue. Dies funktioniert und die beiden TextViews die ich dynamisch ändern möchte, werden im setViewValue behandelt. Was mich verwirrt, ist, warum meine anderen zwei TextViews nicht durch setViewValue geleitet werden. Ich sage dies basierend auf dem Setzen eines Haltepunkts, wo der Ausführungsthread nur zweimal eintritt. Ich habe erwartet, es 4 oder öfter zu sehen?Besseres Verständnis der ViewBinder des SimpleAdapter

Hier ist die setViewValue, wo ich einen Haltepunkt gesetzt habe.

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

XML-Deklaration der TextViews (1 zeigt und 4 nicht):

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

Also zusammenfassend warum die Ausführung nur zweimal die Überschreibung eingeben und es passiert einfach so die genau zu sein zwei möchte ich updaten?

Gut durch zusätzliches Lesen und deduktives Denken sind einige weitere Informationen ans Licht gekommen. In meinen Gedanken jemals in der ListView Zeile XML würde durch die ViewBinder gehen, aber das war falsch! Von dem, was ich herausfinden kann, befestigen Sie die ViewBinder an den DataAdapter über setViewBinder. Nun, da dem DataAdapter gesagt wird, welche Views verwendet werden sollen, um die Daten darin zu füllen, macht es Sinn, dass nur die zwei angezeigt wurden. Ich habe nur zwei enthüllt. Hier

ist ein Ausschnitt, wo ich die Ansichten in der Besiedlungsprozess beteiligten angeben und geben sie an den Konstruktor des 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); 

Während dieser Sinn zu machen scheint, dass ich nicht weiß, dass meine deduktiven ist exakt. Wird aktualisiert, da ich mehr Informationen finde.

Antwort

5

Wenn Sie setzen eine ViewBinder auf SimpleAdapteralle die Views Sie erklärt (in der to Array in Ihrem Fall) wird, egal was die ViewBinder ‚s setViewValue() Methode übergeben werden. Wenn die setViewValue-Methode true nicht zurückgibt, was bedeutet, dass die Datenbindung für diesen View (aus welchem ​​Grund auch immer) fehlgeschlagen ist, erhalten Sie die Standardaktion (für eine TextView), den Text aus den Daten Hashmap. Gerade jetzt haben Sie die setViewValue erklärt, etwas für nur zwei TextViews zu tun (Überprüfung durch ihre IDs) und auch trueegal was zurückgeben. Wenn Sie die setViewValue für die anderen Views in Ihrem Zeilenlayout eingeben, geben Sie erneut die setViewValue ein, stimmen Sie nicht mit den IDs überein (also keine Aktualisierungen für diese Views) und geben Sie true zurück (was dem Adapter mitteilt, dass die Bindung erfolgte) erfolgreich und diese View erfordert keine weitere Arbeit). A look at the source code für die SimpleAdapter.bindView Methode zeigt Ihnen, wie die ViewBinder verwendet wird.

Auch sehe ich, dass Sie einen benutzerdefinierten Adapter verwenden, sind Sie sicher, dass Sie nicht mit der normalen Logik interferieren?(Verwenden Sie nicht den gleichen Namen für den Klassen- und Variablennamen.)

+0

Roger bei der Benennung der Klasse und Variable gleich. Du hast recht und ich habe gerade schnell für den Beitrag getippt. Was die Rückgabe von True betrifft, verstehe ich, was Sie sagen, indem Sie IMMER true von setViewValue zurückgeben. Ich schaue mir den Link an, der jetzt zur Verfügung gestellt wird, um einen besseren Weg zu finden, um von setViewValue zurückzukehren, so dass es nicht nur hartkodiert ist. – GPGVM

+1

Alter, das ist großartig. Ich wusste nicht, dass man so in den Quellcode schauen kann. Doppelt danke. – GPGVM