2011-07-28 6 views
11

AlphabetIndexer 대신 SectionIndexer을 사용하는 방법을 찾으려고합니다. 내가해야 할 일은 알파벳 대신 섹션 헤더에 문자열 배열 요소를 포함시키는 것입니다. 섹션 인덱서를 사용하여 샘플 코드를 찾을 수 없었습니다.Android : SectionIndexer를 사용하는 방법

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

AlphabetIndexer에 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"대신 stringArray를 전달하는 것이 가능하므로 I 수 대신에 "A", "B"의 예 : 여기

AlphabetIndexer 대한 샘플 코드이다. 헤더에 "Z"는 "Book", "Food", ... 헤더에 있습니까?

그렇지 않은 경우 가장 좋은 방법은 무엇입니까? AlphabetIndexer 대신 SectionIndexer을 사용하는 샘플 코드에 대한 참조는 도움이 될 것입니다.

도움 주셔서 감사합니다. TJ

+0

ListView에서 요소를 분리하려고하거나 아니면 SectionIndexer를 사용하려는 또 다른 이유가 있습니까? –

+0

Listview에 섹션을 만들고 싶습니다. 각 섹션에는 자체 헤더가 있고 각 섹션에는 클릭 가능한 요소가 많이 있습니다. 물론 섹션 헤더는 클릭 할 수 없어야합니다. – TJ1

+0

나는 비슷한 것을하고있다. http://stackoverflow.com/questions/10224233/alphabetindexer-with-custom-adapter-managed-by-loadermanager – toobsco42

답변

12

사용자 지정 ArrayAdapter을 작성하고 기본적으로 헤더가 표시되어야하는 위치에 대해 getView(...) 방법의 "섹션 헤더"보기를 반환 할 수 있습니다.

또한 새로운 유형의보기 수 (이 경우 2)를 반환하고 현재 위치에 대한보기 유형을 반환하려면 getItemViewType (int position)을 반환해야합니다. getViewTypeCount()을 덮어 써야합니다.

또한 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는 title, subtitle 및 섹션 헤더인지 여부를 알 수있는 부울 값에 대한 간단한 컨테이너입니다. 티.

이 어댑터를 쓰는 유일한 방법은 아니지만 도움이 되었기를 바랍니다.

+0

응답에 감사드립니다. – TJ1

+0

이 코드를 사용하려고하는데 답변을 수락하기 전에 몇 가지 질문이 있습니다. @Mircea는 도움을 주신 것에 대해 다시 한번 감사드립니다 : 나의 previouse 코드에서 나는 문자열 Arrat "파일"을 사용했고 내가 사용한 방법은 : 'setListAdapter (new ArrayAdapter (this, R.layout.row, files));' . 이제 귀하의 코드를 사용하여 ArrayAdapter 대신 ItemListAdapter를 사용해야합니까? 그것을 사용하는 적절한 방법은 무엇입니까? 나는 가지고 있어야한다 : 'setListAdapter (new ItemListAdapter (this, R.layout.row, files));' ? – TJ1

+0

'setListAdapter (새 ItemListAdapter (this, R.layout.' 'fileslist' 배열에서'ArrayList modelItems'을 빌드하고 섹션 헤더가 있어야하는 위치에 추가 항목을 삽입해야합니다. 아이디어는 ItemListAdapter가 행을 섹션 헤더로 부 풀릴 위치와 일반 행으로 팽창 할 위치를 알고 있다는 것입니다. ModelItem 클래스를 만들고 섹션 헤더가 있어야하는 isHeader()와 정상적인 행에 대해 false로 응답하도록 만들었습니다. –

관련 문제