You can achieve this with the ListView class and custom adapter.
Note that the adapter has int getViewTypeCount() and int getItemViewType(int position) methods that you can overwrite.
Look at a sample implementation of a dataset in Map of lists
public abstract class ExampleMapAdapter<V extends Map<?, ? extends List<?>>> extends BaseAdapter { public static final int VIEW_TYPE_HEADER = 0; public static final int VIEW_TYPE_LISTITEM = 1; protected V data; protected int[] sectionsStart; protected Object[] sections; protected int count; public ExampleMapAdapter(V data) { this.data = data; onSetData(); } @Override public int getCount() { return count; } @Override public Object getItem(int position) { int sectionIndex = getSectionForPosition(position); int innerIndex = position - sectionsStart[sectionIndex]; if(innerIndex == 0) { //head return sections[sectionIndex]; } else { //values return data.get(sections[sectionIndex]).get(innerIndex - 1); } } @Override public long getItemId(int position) { return position; } @Override public int getViewTypeCount() { return 2; } @Override public int getItemViewType(int position) { return Arrays.binarySearch(sectionsStart, position) < 0 ? VIEW_TYPE_LISTITEM : VIEW_TYPE_HEADER; } public int getPositionForSection(int section) { return sectionsStart[section]; } public int getSectionForPosition(int position) { int section = Arrays.binarySearch(sectionsStart, position); return section < 0 ? -section - 2 : section; } @Override public View getView(int position, View convertView, ViewGroup parent) { if(getItemViewType(position) == VIEW_TYPE_HEADER) { return getHeaderView(position, convertView, parent); } else { return getListItemView(position, convertView, parent); } } @Override public void notifyDataSetInvalidated() { data = null; onSetData(); super.notifyDataSetInvalidated(); } @Override public void notifyDataSetChanged() { onSetData(); super.notifyDataSetChanged(); } protected void onSetData() { if(data == null) { sectionsStart = null; sections = null; count = 0; } else { sectionsStart = new int[data.size()]; sections = data.keySet().toArray(new Object[data.size()]); count = 0; int i = 0; for(List<?> v : data.values()) { sectionsStart[i] = count; i++; count += 1 + v.size(); } } } protected abstract View getHeaderView(int position, View convertView, ViewGroup parent); protected abstract View getListItemView(int position, View convertView, ViewGroup parent); }
and usage example:
public class ExampleActivity extends Activity { class SubItem { public final String text; public final int number; public final boolean checked; public SubItem(String text, int number, boolean checked) { this.text = text; this.number = number; this.checked = checked; } }
Tomasz gawel
source share