2012-08-02 72 views
3

我在ListActivity中有一個非常簡單的ListView,它只顯示文本值列表。以下是我當前的代碼:在Android中,ListView可以有兩種或兩種以上不同類型的行佈局嗎?

public class InfoActivity extends ListActivity { 

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

     List<String> values = new ArrayList<String>(); 
     // loads up the values array here 
     // ... 

     ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, values); 
     setListAdapter(adapter); 
    } 

我的InfoActivity XML文件沒有任何內容,因爲我使用的是ListActivity。

我想要做的是爲行定製佈局。前5行將有layoutA.xml,第5行將有layoutB.xml。

我該怎麼做?我迷失在從哪裏開始。很顯然,我正在尋找最簡單的代碼。

+0

可能重複:http://stackoverflow.com/questions/4777272/android-listview-with-different-layout-for-each-row – Ixx 2012-08-02 22:36:08

回答

2

這很簡單,你只需要擴展ArrayAdapter。我ArrayAdapter做兩分不同的事情:

  • 強似一個RESOURCEID,我的適配器採取ResourceIds
  • 陣列
  • getView()檢查位置並加載相應的資源

這是一個微不足道的例。如果你打算使它比前半部分看起來更復雜,而後半部分不同,那麼你應該覆蓋getViewTypeCount()getItemViewType()

工作例如:

public class Example extends Activity { 
    public class MyArrayAdapter<T> extends ArrayAdapter<T> { 
     LayoutInflater mInflater; 
     int[] mLayoutResourceIds; 

     public MyArrayAdapter(Context context, int[] textViewResourceId, List<T> objects) { 
      super(context, textViewResourceId[0], objects); 
      mInflater = (LayoutInflater)context.getSystemService (Context.LAYOUT_INFLATER_SERVICE); 
      mLayoutResourceIds = textViewResourceId; 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      if (convertView == null && position > 2) 
       convertView = mInflater.inflate(mLayoutResourceIds[1], parent, false); 
      return super.getView(position, convertView, parent); 
     } 
    } 

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

     String[] array = new String[] {"one", "two", "three", "four", "five", "six"}; 
     List<String> list = new ArrayList<String>(); 
     Collections.addAll(list, array); 

     ListView listView = new ListView(this); 
     listView.setAdapter(new MyArrayAdapter<String>(this, new int[] {android.R.layout.simple_list_item_1, android.R.layout.simple_list_item_single_choice}, list)); 
     setContentView(listView); 
    } 
} 
0

我相信如果你有一個櫃檯,說從0開始,然後充氣並重新使用前五個與layoutA.xml,那麼當其在5,報廢充氣layoutA.xmllayoutB.xml。這應該很簡單。當然,我通過BaseAdapter來討論這個問題,它允許你製作一個適配器來設置ListView中的每一行。我從來沒有使用過ListActivity。但是這個過程應該是一樣的。

只需添加@lxx發佈的鏈接,我的意思是,它絕對可以幫助您找出如何完成您想要的內容。雖然我認爲在我想要使用這些方法的時候會有這樣的矯枉過正,當你需要一種5種,另一種5種時。絕對使用該鏈接作爲良好的基準,但只需使用計數器。它更簡單。在內存方面,只有在知道計數器已經放入5個視圖時才重新佈局佈局。這樣你就不會每次都這樣做。

0

你可以嘗試使用MergeAdapter(CWAC合併),其中在一個ListView中你可以有不同的佈局有多個適配器。

0

如果我們需要在列表視圖中顯示不同類型的視圖,那麼在適配器中使用getViewTypeCount()和getItemViewType(),而不是切換視圖VIEW.GONE和VIEW.VISIBLE在getView中可能非常昂貴()會影響列表滾動。

請在適配器中選中getViewTypeCount()和getItemViewType()。

鏈接:the-use-of-getviewtypecount

相關問題