2013-08-29 4 views
0

사용자 정의 어댑터로 listview를 채우는 안드로이드 앱이 있습니다. 이 어댑터는 헤더가있는 listview에 섹션을 추가합니다. 이 어댑터는 다음과 같습니다 : 다음 코드에 의해 호출된다listview에서 복잡한 헤더 레이아웃 사용

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. 나는이 오류를 이해하지만 안드로이드에 비교적 익숙하지 않기 때문에이 문제를 해결하는 방법을 모르겠습니다. TextView 대신 RelativeLayout을 루트 요소로 포함하는 헤더를 처리하도록 어댑터를 수정하려면 어떻게해야합니까?

편집 : 대답은 어댑터의 생성자 방법에 있다고 믿습니다.

답변

1

편집 : 대답은 어댑터의 생성자 방법에있는 것 같습니다.

정확하게, 당신은 this one을 사용해야합니다

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

this answer를 보라.

관련 문제