사용자 지정 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 및 섹션 헤더인지 여부를 알 수있는 부울 값에 대한 간단한 컨테이너입니다. 티.
이 어댑터를 쓰는 유일한 방법은 아니지만 도움이 되었기를 바랍니다.
ListView에서 요소를 분리하려고하거나 아니면 SectionIndexer를 사용하려는 또 다른 이유가 있습니까? –
Listview에 섹션을 만들고 싶습니다. 각 섹션에는 자체 헤더가 있고 각 섹션에는 클릭 가능한 요소가 많이 있습니다. 물론 섹션 헤더는 클릭 할 수 없어야합니다. – TJ1
나는 비슷한 것을하고있다. http://stackoverflow.com/questions/10224233/alphabetindexer-with-custom-adapter-managed-by-loadermanager – toobsco42