2013-08-29 64 views
0

我有一個Android應用程序,它使用自定義適配器填充列表視圖。該適配器將部分添加到帶有標題的列表視圖。該適配器如下圖所示:在列表視圖中使用複雜的頁眉佈局

public class SeparatedListAdapter extends BaseAdapter { 

    public final Map<String,Adapter> sections = new LinkedHashMap<String,Adapter>(); 
    public final ArrayAdapter<String> headers; 
    public final static int TYPE_SECTION_HEADER = 0;   

    public SeparatedListAdapter(Context context) { 
     headers = new ArrayAdapter<String>(context, R.layout.list_header); 
    } 

    public void addSection(String section, Adapter adapter) { 
     this.headers.add(section); 
     this.sections.put(section, adapter); 
    } 

    public Object getItem(int position) { 
     for(Object section : this.sections.keySet()) { 
      Adapter adapter = sections.get(section); 
      int size = adapter.getCount() + 1; 

      // check if position inside this section 
      if(position == 0) return section; 
      if(position < size) return adapter.getItem(position - 1); 

      // otherwise jump into next section 
      position -= size; 
     } 
     return null; 
    } 

    public int getCount() { 
     // total together all sections, plus one for each section header 
     int total = 0; 
     for(Adapter adapter : this.sections.values()) 
      total += adapter.getCount() + 1; 
     return total; 
    } 

    public int getViewTypeCount() { 
     // assume that headers count as one, then total all sections 
     int total = 1; 
     for(Adapter adapter : this.sections.values()) 
      total += adapter.getViewTypeCount(); 
     return total; 
    } 

    public int getItemViewType(int position) { 
     int type = 1; 
     for(Object section : this.sections.keySet()) { 
      Adapter adapter = sections.get(section); 
      int size = adapter.getCount() + 1; 

      // check if position inside this section 
      if(position == 0) return TYPE_SECTION_HEADER; 
      if(position < size) return type + adapter.getItemViewType(position - 1); 

      // otherwise jump into next section 
      position -= size; 
      type += adapter.getViewTypeCount(); 
     } 
     return -1; 
    } 

    public boolean areAllItemsSelectable() { 
     return false; 
    } 

    public boolean isEnabled(int position) { 
     return (getItemViewType(position) != TYPE_SECTION_HEADER); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     int sectionnum = 0; 
     for(Object section : this.sections.keySet()) { 
      Adapter adapter = sections.get(section); 
      int size = adapter.getCount() + 1; 

      // check if position inside this section 
      if(position == 0) return headers.getView(sectionnum, convertView, parent); 
      if(position < size) return adapter.getView(position - 1, convertView, parent); 

      // otherwise jump into next section 
      position -= size; 
      sectionnum++; 
     } 
     return null; 
    } 

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

} 

,然後通過下面的代碼名爲:

SeparatedListAdapter adapter; 

    public Map<String,?> createItem(String name) { 
     Map<String,String> item = new HashMap<String,String>(); 
     item.put(ITEM_VALUE, name); 
     return item; 
    } 

List<Map<String,?>> item = new LinkedList<Map<String,?>>(); 
item.add(createItem("value")); 
adapter.addSection("Header", new SimpleAdapter(this, item, R.layout.list_item, new String[] { "value" }, new int[] { R.id.lblValue })); 
listview.setAdapter(adapter); 

現在直到最近,我list_header xml文件有TextView根元素。此時它完美地工作。但後來我想擴展標題以包含多個視圖。 list_header的新根元素現在是RelativeLayout

現在,當我嘗試啓動活動時,出現以下異常:IllegalStateException: ArrayAdapter requires the resource ID to be a Text View。我明白這個錯誤,但由於我對Android比較陌生,所以我不確定如何解決這個問題。如何修改我的適配器以處理包含RelativeLayout作爲根元素的頭,而不是TextView

編輯: 我相信答案在於適配器的構造函數方法嗎?

回答

1

編輯:我相信答案在於 適配器的構造方法?

準確地說,你應該使用this one

headers = new ArrayAdapter<String>(context, R.layout.list_header, R.id.the_id_of_textview); 

而且,看看this answer