2012-06-29 14 views
31

因此,下面將創建一個ListView,其中行的「主」文本視圖由values數組填充。如何使用simple_list_item_2設置ListView的兩行?

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
    android.R.layout.simple_list_item_2, android.R.id.text1, values); 

將第三個參數更改爲android.R.id.text2將設置「輔助」textview。有沒有簡單的方法來設置兩者?

回答

39

AFAIK simple_list_item_2包含一個包含兩個TextView的TwoLineListItem。 ArrayAdapter不會在這裏工作,您必須創建一個自定義適配器或使用支持SimpleCursorAdapter的自定義適配器。

ListAdapter adapter = new SimpleCursorAdapter(
       this, 
       android.R.layout.simple_list_item_2, 
       mCursor,  // Pass in the cursor to bind to. 
       new String[] {People.NAME, People.COMPANY}, // Array of cursor columns to bind to. 
       new int[] {android.R.id.text1, android.R.id.text2}); // Parallel array of which template objects to bind to those columns. 

     // Bind to our new adapter. 
     setListAdapter(adapter); 

或者,如果你不想SimpleCursorAdapter你必須創建一個自定義ArrayAdapter或BaseAdapter

創建自定義ArrayAdapter,應用(有兩項)陣列的自定義適配器的對象,將其提供給getListView.setAdapter。

重寫ArrayAdapter的getView方法,將您的名稱字符串應用於自定義列表行視圖中的TextView。

以下代碼將幫助您。

SampleActivity.java

package org.sample; 

import java.util.ArrayList; 

import android.app.ListActivity; 
import android.content.Context; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.TextView; 
import android.widget.TwoLineListItem; 

public class SampleActivity extends ListActivity { 

    @Override 
    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 

     Person person; 

     ArrayList<Person> persons = new ArrayList<Person>(); 

     person = new Person(); 
     person.setName("Vipul"); 
     person.setAge(20); 
     persons.add(person); 

     person = new Person(); 
     person.setName("Anil"); 
     person.setAge(22); 
     persons.add(person); 

     setListAdapter(new MyAdapter(this, persons)); 
    } 

} 

Person.java

class Person { 
    String name; 
    int age; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public int getAge() { 
     return age; 
    } 

    public void setAge(int age) { 
     this.age = age; 
    } 

} 

MyAdapter.java

class MyAdapter extends BaseAdapter { 

    private Context context; 
    private ArrayList<Person> persons; 

    public MyAdapter(Context context, ArrayList<Person> persons) { 
     this.context = context; 
     this.persons = persons; 
    } 

    @Override 
    public int getCount() { 
     return persons.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return persons.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return 0; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     TwoLineListItem twoLineListItem; 

     if (convertView == null) { 
      LayoutInflater inflater = (LayoutInflater) context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      twoLineListItem = (TwoLineListItem) inflater.inflate(
        android.R.layout.simple_list_item_2, null); 
     } else { 
      twoLineListItem = (TwoLineListItem) convertView; 
     } 

     TextView text1 = twoLineListItem.getText1(); 
     TextView text2 = twoLineListItem.getText2(); 

     text1.setText(persons.get(position).getName()); 
     text2.setText("" + persons.get(position).getAge()); 

     return twoLineListItem; 
    } 
} 
+0

您使用的getter /在'Person.Java'制定者這是後話谷歌對他們的業績指南的建議。 – Fred

+8

@Fred Android的性能提示頁面建議開發人員「避免使用INTERNAL getters/setter」,他們似乎指的是訪問成員變量的方法。這並不意味着你不應該編寫具有適合世界其他地方與之交互的適當界面的類。在同一篇文章中,他們還指出ProGuard將吸氣劑和吸附劑列入其中,這使得整個研究成果毫無意義。 – spaaarky21

+0

這是一個很好的答案,在代碼中提供了所需的信息和非常實用的應用程序。 – LarsH

2

可以試試這個爲WEL升....

adapter = new ArrayAdapter(this,android.R.layout.simple_list_item_2,values){ 
      @Override 
      public View getView(int position, View convertView, ViewGroup parent){ 

       TwoLineListItem row = (TwoLineListItem)super.getView(position, convertView, parent); 

       row.getText1().setText(values.get***()); 
       row.getText2().setText(values.get****()); 

       return row; 
      } 
     }; 
    setAdapter(adapter); 
+0

沒有爲我工作,但這樣做:http://www.sethgholson.com/2012/01/using-simple_list_item_2-with-an-arrayadapter-android/ – pstoppani

+0

這是錯誤的 - 你不使用convertView ''或'父'... – Timmmm

+0

@Tmmmmm'super.getView()'方法照顧。 –

93

這個問題與谷歌排名高,但我認爲給定的答案太複雜。正如在other的答案中指出的,使用ArrayAdapter可以很容易地實現所需的功能。

您可以覆蓋一個ArrayAdapter的getView方法:

ArrayAdapter adapter = new ArrayAdapter(context, android.R.layout.simple_list_item_2, android.R.id.text1, list) { 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
    View view = super.getView(position, convertView, parent); 
    TextView text1 = (TextView) view.findViewById(android.R.id.text1); 
    TextView text2 = (TextView) view.findViewById(android.R.id.text2); 

    text1.setText(persons.get(position).getName()); 
    text2.setText(persons.get(position).getAge()); 
    return view; 
    } 
}; 

如果你沒有注意到:關鍵是要提供android.R.id.text1爲(主要是不必要的)參數,否則調用super將導致異常。

此外,該解決方案不使用的TwoLineListItem,這是在API棄用17

+0

感謝此工作!傳遞給ArrayAdapter的'list'變量永遠不會被真正使用。 – Fred

+0

是的,TwoLineListItem已被棄用,但不要認爲它與SimpleCursorAdapter相關,僅僅因爲它們在Vipul的例子中一起使用。 SimpleCursorAdapter是一個非常有用的通用ListAdapter實現,它遍歷Cursor行,將給定的列映射到給定的佈局視圖。在從Cursor填充ListView時,通常應該優先編寫自己的ListAdapter。儘管即使你沒有使用Cursor,但使用SimpleCursorAdapter並將你的數據包裝在MatrixCursor中也不會出現問題。 – spaaarky21

+0

你說得對,TwoLineListItem與SimpleCursorAdapter無關。我僅僅因爲TwoLineListItem用於其他兩個答案而包含了該評論。我的解決方案僅適用於簡單的簡短列表。例如更高級的解決方案也使用ViewHolder模式。 – winne2

4

希望這有助於你

ArrayAdapter<CustomObject> adapter = new ArrayAdapter<CustomObject> (_context, android.R.layout.simple_list_item_2, android.R.id.text1, listCustomObject) { 

           @Override 
           public View getView(int position, 
             View convertView, ViewGroup parent) { 
            View view = super.getView(position, convertView, parent); 

            TextView text1 = (TextView) view.findViewById(android.R.id.text1); 
            TextView text2 = (TextView) view.findViewById(android.R.id.text2); 

            text1.setText(listCustomObject.get(position).getText1()); 

            text2.setText(listCustomObject.get(position).getText2()); 

            return view; 
           } 

          }; 
相關問題