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.
Nguồn
2011-07-28 16:54:32
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? –
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
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