2011-07-28 37 views
11

Tôi đang cố gắng tìm cách sử dụng SectionIndexer, thay vì AlphabetIndexer. Những gì tôi quan tâm để làm là để có các yếu tố của một mảng chuỗi trên phần đầu thay vì bảng chữ cái. Tôi đã không thể tìm thấy bất kỳ mã mẫu nào bằng cách sử dụng phần chỉ mục.Android: cách sử dụng SectionIndexer

Dưới đây là một số mẫu mã cho AlphabetIndexer:

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

Có thể vượt qua một stringArray thay vì "ABCDEFGHIJKLMNOPQRSTUVWXYZ" vào AlphabetIndexer vì vậy tôi có thể ví dụ thay vì "A", "B",. .. "Z" là tiêu đề có "Sách", "Thực phẩm", ... trên tiêu đề?

Nếu không phải cách tốt nhất để làm điều đó là gì? Bất kỳ tham chiếu nào đến mã mẫu sử dụng SectionIndexer thay vì AlphabetIndexer cũng sẽ hữu ích.

Cảm ơn sự giúp đỡ. TJ

+0

Bạn chỉ đang cố gắng tách riêng các phần tử trong ListView của mình hoặc có lý do nào khác mà bạn muốn sử dụng một SectionIndexer không? –

+0

Tôi muốn tạo các phần trong Listview của tôi, mỗi phần có tiêu đề riêng và mỗi phần có một số yếu tố có thể nhấp. Không thể nhấp vào tiêu đề của phần khóa học. – TJ1

+0

Tôi đang làm một cái gì đó tương tự Ở đây http://stackoverflow.com/questions/10224233/alphabetindexer-with-custom-adapter-managed-by-loadermanager – toobsco42

Trả lời

12

Bạn có thể thử viết ArrayAdapter tùy chỉnh và về cơ bản trả lại chế độ xem "tiêu đề phần" theo phương pháp getView(...) cho các vị trí mà tiêu đề sẽ xuất hiện.

Bạn cũng sẽ phải ghi đè số getViewTypeCount() để trả về số loại chế độ xem mới (trong trường hợp này là 2) và getItemViewType (int position) để trả lại loại chế độ xem cho vị trí hiện tại.

Ngoài ra, onItemClickListener nên kiểm tra xem mục bạn đã nhấp vào có phải là tiêu đề phần hay không.

Đây là bộ chuyển đổi mảng tùy chỉnh của tôi:

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

Đây là tập tin 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> 

và đây là 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" 
/> 

Các ModelItem class là một container đơn giản cho tiêu đề, phụ đề và một boolean để cho biết đó là một tiêu đề phần hay không t.

Đây không phải là cách duy nhất để viết bộ điều hợp này nhưng tôi hy vọng điều này sẽ giúp ích.

+0

cảm ơn bạn đã trả lời. – TJ1

+0

Tôi đang cố gắng sử dụng các mã này và tôi có một số câu hỏi trước khi tôi có thể chấp nhận câu trả lời. @Mircea cảm ơn một lần nữa vì sự giúp đỡ: Trong mã previouse của tôi, tôi đã có một tệp String Arrat "" và cách tôi sử dụng nó là: 'setListAdapter (new ArrayAdapter (this, R.layout.row, files));' . Bây giờ sử dụng mã của bạn tôi nên sử dụng ItemListAdapter thay vì ArrayAdapter? Cách thích hợp để sử dụng nó là gì? Tôi sẽ có: 'setListAdapter (new ItemListAdapter (this, R.layout.row, files));' ? – TJ1

+0

Bạn có thể sử dụng nó như 'setListAdapter (new ItemListAdapter (điều này, R.layout.row, modelItems)); ' Nhưng trước tiên, bạn phải xây dựng' ArrayList modelItems' từ mảng 'tệp' của bạn và chèn các mục bổ sung nơi tiêu đề phần của bạn nên. Ý tưởng là ItemListAdapter của bạn biết nơi để tăng cường hàng như là một tiêu đề phần và nơi để thổi phồng nó như một hàng bình thường. Tôi đã làm điều đó bằng cách tạo lớp ModelItem và làm cho nó phản hồi đúng với isHeader() trong đó tiêu đề phần phải và sai đối với các hàng bình thường. –

Các vấn đề liên quan