2014-01-08 114 views
8

我有一個具有多個TextView中的像這樣的列表視圖:有沒有辦法使用ArrayAdapter更新多個TextView?

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

我POJO的名單具有nameaddress,我想在列表視圖中的每個項目,以與那些值填充。

我的POJO是這樣的:

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

問題

當我設置我的名單列表適配器我怎麼能同時設置名稱和地址?

目前我在做這裏面只設置名稱:

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

爲什麼你的'ArrayAdapter'有一個'Color'類型,如果你正在傳遞'personList'? –

+0

對不起,這是一個例子的錯字。我糾正了它。 – birdy

回答

12

您應該創建一個自定義adapter,它可以延伸ArrayAdapter。你可以用ArrayAdapter做的事情是有限的。

事情是這樣的:

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

textView1textView2 ... textView-n都是你的文本視圖。如下設置你的適配器:

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

注:我假設你personListList類型的對象。如果是Array,請告訴我。

+0

這是一個很好的答案。找不到像這樣的工作! – Michael

0

我會檢查出TwoLineArrayAdapter通過ESV,它的格式化姓名和職務,但幾乎正是你需要的。

編輯:

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

對於ñ串的情況下,該解決方案是非常相似的。根據這個數量是否固定,創建StringHolder[]List<StringHolder>類型的自定義ArrayAdapter。在您的getView中,您將遍歷所有StringHolder對象,請致電findViewById,並更新文本內容。或者,您可以簡單地使用數組/列表中的索引,並將其映射到視圖ID(如果它們將保持一致)。

這當然只是一種方式來做到這一點,還有更多,我將離開實際的實施作爲練習讀者。

+0

謝謝。然而,我給出的兩個例子僅僅是爲了問題。一般來說,我正在研究如何做到這一點。如果在某些情況下我可以做什麼,我有五個TextViews – birdy

+0

我認爲一般概念仍然是一樣的。爲什麼不,而不是一個託管兩個字符串的適配器,託管一個字符串列表? ArrayAdapter將是List 的一種。或者如果五是一個固定的數字,String []。然後,您可以選擇使用數組/列表中的位置來決定要更新哪個TextView,或者創建一個簡單的對象來保存對String和View ID的引用。 – Tom

相關問題