2014-01-08 18 views
8

Ich habe eine Listenansicht, die mehrere Textview ist wie dieses hat:Gibt es eine Möglichkeit, mehrere TextView mit ArrayAdapter zu aktualisieren?

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical"> 
    <TextView 
     android:id="@+id/name" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:textSize="16dip" 
     android:textColor="#000000" 
     android:paddingLeft="10dip" 
     android:textStyle="bold"/> 
    <TextView 
     android:id="@+id/address" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:textSize="16dip" 
     android:textColor="#000000" 
     android:paddingTop="15dip" 
     android:paddingBottom="15dip" 
     android:paddingLeft="10dip" 
     android:textStyle="bold"/> 
</RelativeLayout> 

Ich habe eine Liste von POJO ist, die eine name und address hat und ich möchte jedes Element in der Listenansicht mit den Werten gefüllt werden.

Mein POJO ist wie folgt:

public class Person { 
    private String name; 
    private String address; 
    //getter setter 
    public String toString() {return name;} 
} 

Frage

Wenn ich die Liste Adapter mit meiner Liste einstellen, wie kann ich beide Namen gesetzt und die Adresse?

Derzeit mache ich das, die nur den Namen Einstellung ist:

setListAdapter(new ArrayAdapter<Person>(MyActivity.this, R.layout.list_text, R.id.name, personList)); 
+0

Warum hat Ihr 'ArrayAdapter' den Typ' Color', wenn Sie 'personList' übergeben? –

+0

Sorry, das war ein Tippfehler zum Beispiel willen. Ich habe es korrigiert. – birdy

Antwort

12

Sie sollten eine benutzerdefinierte adapter erstellen, die ArrayAdapter erweitert. Die Dinge, die Sie mit einem ArrayAdapter tun können, sind begrenzt.

Etwas wie folgt aus:

public class PersonAdapter extends ArrayAdapter<Person> { 
    private final Context context; 
    private final ArrayList<Person> data; 
    private final int layoutResourceId; 

    public PersonAdapter(Context context, int layoutResourceId, ArrayList<Person> data) { 
     super(context, layoutResourceId, data); 
     this.context = context; 
     this.data = data; 
     this.layoutResourceId = layoutResourceId; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View row = convertView; 
     ViewHolder holder = null; 

     if(row == null) 
     { 
      LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
      row = inflater.inflate(layoutResourceId, parent, false); 

      holder = new ViewHolder(); 
      holder.textView1 = (TextView)row.findViewById(R.id.text1); 
      holder.textView2 = (TextView)row.findViewById(R.id.text2); 
      ... 
      ... 
      holder.textView3 = (TextView)row.findViewById(R.id.text3); 

      row.setTag(holder); 
     } 
     else 
     { 
      holder = (ViewHolder)row.getTag(); 
     } 

     Person person = data.get(position); 

     holder.textView1.setText(person.getName()); 
     holder.textView2.setText(person.getAddress()); 
     ... 
     ... 
     holder.textView3.setText(person.getEtc()); 

     return row; 
    } 

    static class ViewHolder 
    { 
     TextView textView1; 
     TextView textView2; 
     ... 
     ... 
     TextView textView3; 
    } 
} 

Wo textView1, textView2 ... textView-n sind alle Textansichten. Stellen Sie Ihren Adapter wie folgt:

setListAdapter(new PersonAdapter(MyActivity.this, R.layout.list_text, personList)); 

Hinweis: Ich gehe davon aus, dass Ihr personList ist ein List Typ Objekt. Wenn es ein Array ist, lass es mich wissen.

+0

Dies ist eine gute Antwort. Konnte nichts finden, was so gut funktionierte! – Michael

0

ich die TwoLineArrayAdapter von ESV überprüfen würde, ist es für Namen und Titel formatiert aber ist fast genau das, was Sie brauchen.

Edit:

class StringHolder { 
    public String text; 
    public int viewId; 
} 

Für ein Szenario von n Strings, die Lösung ist sehr ähnlich. Erstellen Sie eine benutzerdefinierte ArrayAdapter des Typs StringHolder[] oder List<StringHolder> je nachdem, ob dieser Betrag behoben ist. In Ihrem getView würden Sie alle StringHolder Objekte durchlaufen, findViewById aufrufen und den Textinhalt aktualisieren. Alternativ können Sie einfach den Index im Array/in der Liste verwenden und diesen einer View-ID zuordnen, wenn sie konsistent bleiben.

Dies ist natürlich nur eine Möglichkeit, dies zu tun, es gibt viel mehr und ich werde die tatsächliche Umsetzung als Übung für den Leser verlassen.

+0

Danke. Das Zwei-Zeilen-Beispiel, das ich gab, ist jedoch nur für die Fragen des Wortes. Ich schaue im Allgemeinen, wie man das macht. Was kann ich tun, wenn ich in einem Szenario habe ich fünf TextViews – birdy

+0

Ich denke, das allgemeine Konzept ist immer noch das gleiche. Warum hosten Sie statt eines Adapters, der zwei Strings enthält, eine Liste mit Strings? Ihr ArrayAdapter wäre einer der Typen Liste . Oder wenn five eine feste Zahl ist, String [].Sie können dann auswählen, ob die Position im Array/in der Liste verwendet werden soll, um festzulegen, welche TextView aktualisiert werden soll, oder um ein einfaches Objekt zu erstellen, das einen Verweis auf eine Zeichenfolge und eine View-ID enthält. – Tom

Verwandte Themen