2011-09-08 63 views
0

我正在使用自定義適配器來創建列表,通常它工作正常,但每當我向下滾動一下並備份時,一旦標題應該是顯示/加載(我猜測後者)。它按預期工作,只要我喜歡就可以滾動列表,但是一旦我備份到列表的最頂部,就會拋出IllegalStateException異常。 logcat的輸出以下行:ArrayAdapter在列表中滾動時拋出異常

ERROR/ArrayAdapter(287):你必須提供一個資源ID爲一個TextView

因爲我使用列表適配器代碼:

public class SeparatedListAdapter extends BaseAdapter implements ObservableAdapter{ 

    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, int resId) { 
     super(); 
     headers = new ArrayAdapter<String>(context, resId); 
    } 

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

    public void removeObserver() { 
     for (Map.Entry<String, Adapter> it : sections.entrySet()) { 
      if (it.getValue() instanceof ObservableAdapter) { 
       ObservableAdapter adapter = (ObservableAdapter)it.getValue(); 
       adapter.removeObserver(); 
      } 
     } 
    } 

    public void clear() { 
     headers.clear(); 
     sections.clear(); 
     notifyDataSetInvalidated(); 
    } 

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

      if (position == 0) return section; 
      if (position < size) return adapter.getItem(position - 1); 
      position -= size; 
     } 
     return null; 
    } 

    @Override 
    public int getCount() { 
     int total = 0; 
     for (Adapter adapter : this.sections.values()) 
      total += adapter.getCount() + 1; 
     return total; 
    } 

    @Override 
    public int getViewTypeCount() { 
     int total = 1; 
     for (Adapter adapter : this.sections.values()) 
      total += adapter.getViewTypeCount(); 
     return total; 
    } 

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

      if (position == 0) return TYPE_SECTION_HEADER; 
      if (position < size) return type + adapter.getItemViewType(position - 1); 

      position -= size; 
      type += adapter.getViewTypeCount(); 
     } 
     return -1; 
    } 


    @Override 
    public boolean areAllItemsEnabled() { 
     return false; 
    } 

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

    @Override 
    public boolean isEmpty() { 
     return getCount() == 0; 
    } 

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

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

      position -= size; 
      sectionnum++; 
     } 
     return null; 
    } 

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

    @Override 
    public boolean hasStableIds() { 
     return false; 
    }  

    private DataSetObserver mDataSetObserver = new DataSetObserver() { 
     @Override 
     public void onChanged() { 
      notifyDataSetChanged(); 
     } 
    }; 

} 

我很迷茫,如果有人有任何想法,我會很感激。

回答

0

有以下類型的代碼

if (position == 0) return ...; 
if (position < size) return ...; 
position -= size; 

還有就是position成爲負而沒有被設置爲0,當size爲> = 2,我會檢查,如果是這種情況的危險。