package com.apigee.sdkexplorer; import java.util.HashMap; import android.database.DataSetObserver; import android.graphics.Typeface; import android.util.TypedValue; import android.view.View; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.widget.LinearLayout; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.TextView; public class SectionedListViewAdapter implements ListAdapter { private ListView listView; private ListViewDataSource dataSource; private int numberOfSections; private int numberSectionHeaders; private int numberRegularRows; private int numberViews; private HashMap<Integer,IndexPath> mapPosition; public SectionedListViewAdapter(ListView listView, ListViewDataSource dataSource) { this.listView = listView; this.dataSource = dataSource; mapPosition = new HashMap<Integer,IndexPath>(); if( dataSource != null ) { numberOfSections = dataSource.numberOfSectionsInListView(listView); numberSectionHeaders = 0; numberRegularRows = 0; int positionIndex = 0; for( int sectionIndex = 0; sectionIndex < numberOfSections; ++sectionIndex ) { int numberRowsInSection = dataSource.listViewNumberOfRowsInSection(listView, sectionIndex); numberRegularRows += numberRowsInSection; String sectionHeader = dataSource.listViewTitleForHeaderInSection(listView, sectionIndex); if( sectionHeader != null ) { mapPosition.put(Integer.valueOf(positionIndex), new IndexPath(sectionIndex,-1)); ++numberSectionHeaders; ++positionIndex; } for( int rowIndex = 0; rowIndex < numberRowsInSection; ++rowIndex ) { mapPosition.put(Integer.valueOf(positionIndex), new IndexPath(sectionIndex,rowIndex)); ++positionIndex; } } } else { numberOfSections = 0; numberSectionHeaders = 0; numberRegularRows = 0; } numberViews = numberSectionHeaders + numberRegularRows; } @Override public boolean areAllItemsEnabled() { return numberSectionHeaders == 0; } @Override public boolean isEnabled(int position) { IndexPath indexPath = mapPosition.get(Integer.valueOf(position)); if( indexPath.row == -1 ) { return false; } else { return true; } } @Override public boolean isEmpty() { return numberViews == 0; } @Override public boolean hasStableIds() { return true; } @Override public int getCount() { return numberViews; } @Override public int getViewTypeCount() { if( numberSectionHeaders > 0 ) { return 2; } else { return 1; } } @Override public Object getItem(int position) { return getView(position,null,null); } @Override public int getItemViewType(int position) { return IGNORE_ITEM_VIEW_TYPE; } @Override public long getItemId(int position) { return position; } public View headerView(String title) { LinearLayout ll = new LinearLayout(listView.getContext()); ll.setOrientation(LinearLayout.VERTICAL); LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); layoutParams.setMargins(10, 3, 0, 0); TextView tv = new TextView(listView.getContext()); tv.setText(title); tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18); tv.setTypeface(null, Typeface.BOLD); tv.setTextColor(0xFFFFFFFF); ll.setBackgroundColor(0xFF818A93); ll.addView(tv, layoutParams); return ll; } @Override public View getView(int position, View convertView, ViewGroup viewGroup) { IndexPath indexPath = mapPosition.get(Integer.valueOf(position)); if( indexPath.row == -1 ) { String headerTitle = dataSource.listViewTitleForHeaderInSection(listView, indexPath.section); return headerView(headerTitle); } else { return dataSource.listViewCellForRowAtIndexPath(listView, convertView, indexPath); } } @Override public void registerDataSetObserver(DataSetObserver observer) { } @Override public void unregisterDataSetObserver(DataSetObserver observer) { } }