2011-07-28 36 views
11

我想找到一種方法來使用SectionIndexer,而不是AlphabetIndexer。我感興趣的是在部分標題中使用字符串數組的元素而不是字母。我一直無法使用分節索引器找到任何示例代碼。Android:如何使用SectionIndexer

下面是AlphabetIndexer一個示例代碼:

private AlphabetIndexer indexer; 
indexer = new AlphabetIndexer(c, c.getColumnIndexOrThrow(
    DbHelper.COUNTRIES_NAME),"ABCDEFGHIJKLMNOPQRSTUVWXYZ"); 

是否有可能通過一個stringArray代替 「ABCDEFGHIJKLMNOPQRSTUVWXYZ」 的到AlphabetIndexer所以可以例如不是 「A」, 「B」,。 ..「Z」作爲標題有「書」,「食品」,...在標題上?

如果不是最好的辦法是什麼?任何對使用SectionIndexer而不是AlphabetIndexer的示例代碼的引用也會有所幫助。

感謝您的幫助。 TJ

+0

你只是想分開ListView中的元素,還是有另一個你想使用SectionIndexer的原因? –

+0

我想在我的Listview中創建節,每個節都有自己的標題,每個節都有一些可點擊的元素。當然,節標題不應該是可點擊的。 – TJ1

+0

我正在做類似的事情http://stackoverflow.com/questions/10224233/alphabetindexer-with-custom-adapter-managed-by-loadermanager – toobsco42

回答

12

您可以嘗試編寫自定義ArrayAdapter,並在getView(...)方法中基本上返回標題出現位置的「節標題」視圖。

您還必須覆蓋getViewTypeCount()以返回新類型視圖的數量(在本例中爲2)和getItemViewType (int position)以返回當前位置的視圖類型。

此外,onItemClickListener應該檢查您點擊的項目是否爲節標題。

這是我的自定義陣列適配器:

public class ItemListAdapter extends ArrayAdapter<ModelItem> 
{ 
    private static final int TYPE_SECTION_HEADER = 0; 
    private static final int TYPE_LIST_ITEM = 1; 

    int mDefaultRowLayoutResID; 
    Context mContext; 
    LayoutInflater mInflater; 
    ArrayList<ModelItem> lItems; 

    public ItemListAdapter(Context context, int resource, ArrayList<ModelItem> items) 
    { 
     super(context, resource, items); 
     mContext = context; 
     mResource = resource; 
     mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     lItems = items; 
    } 

    @Override 
    public ModelItem getItem(int position) 
    { 
     return lItems.get(position); 
    } 

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

    @Override 
    public int getViewTypeCount() 
    { 
     return 2; 
    } 

    @Override 
    public int getItemViewType(int position) 
    { 
     ModelItem item = lItems.get(position); 
     if (item.isHeader()) 
     { 
      return TYPE_SECTION_HEADER; 
     } 
     else 
     { 
      return TYPE_LIST_ITEM; 
     } 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) 
    { 
     ViewHolder holder; 
     ModelItem item = getItem(position); 

     if (convertView == null) 
     { 
      if (item.isHeader()) 
      { 
       convertView = mInflater.inflate(R.layout.row_item_section_header, null); 
       holder = new ViewHolder(); 
       holder.title = (TextView)convertView.findViewById(R.id.list_header_title); 
       holder.subtitle = null; 
       convertView.setTag(holder); 
      } 
      else 
      { 
       convertView = mInflater.inflate(R.layout.row_item_default, null); 
       holder = new ViewHolder(); 
       holder.title = (TextView)convertView.findViewById(R.id.row_item_title); 
       holder.subtitle = (TextView)convertView.findViewById(R.id.row_item_subtitle); 
       convertView.setTag(holder); 
      } 
     } 
     else 
     { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     holder.title.setText(item.getTitle()); 
     if (holder.subtitle != null) 
     { 
      holder.subtitle.setText(item.getSubtitle()); 
     } 
     return convertView; 
    } 

    private class ViewHolder 
    { 
     public TextView title; 
     public TextView subtitle; 
     public ImageView leftIcon; 
     public View rightControl; 
    } 
} 

這是row_item_default.xml文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    > 
    <TextView 
     android:id="@+id/row_item_title" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
    /> 
    <TextView 
     android:id="@+id/row_item_subtitle" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@+id/row_item_title" 
    /> 
</RelativeLayout> 

,這是row_item_section_header.xml:

<TextView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/list_header_title" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    style="?android:attr/listSeparatorTextViewStyle" 
/> 

的ModelItem class是標題,字幕和布爾值的簡單容器,用於判斷它是否爲節標題或否噸。

這不是寫這個適配器的唯一方法,但我希望這有助於。

+0

感謝您的答覆。 – TJ1

+0

我想要使用這些代碼,並且在接受答案之前我有一些問題。 @Mircea再次感謝您的幫助:在我的前代碼中,我有一個String Arrat「files」,我用它的方式是:'setListAdapter(new ArrayAdapter (this,R.layout.row,files));' 。現在使用你的代碼我應該使用ItemListAdapter而不是ArrayAdapter?什麼是使用它的正確方法?我應該有:'setListAdapter(new ItemListAdapter (this,R.layout.row,files));' ? – TJ1

+0

你可以使用它像 'setListAdapter(new ItemListAdapter (this,R.layout。row,modelItems));' 但是,您必須首先從您的'files'數組中創建'ArrayList modelItems',並在您的節標題所在的位置插入其他項目。 這個想法是,你的ItemListAdapter知道在哪裏膨脹的行作爲部分標題和在哪裏膨脹作爲一個普通的行。 我通過創建ModelItem類並使其對TrueHeader()進行響應,其中節標題應爲true,對於普通行而爲false。 –