Skip to content

Instantly share code, notes, and snippets.

@carlosefonseca
Created April 8, 2013 15:49
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save carlosefonseca/5337861 to your computer and use it in GitHub Desktop.
Save carlosefonseca/5337861 to your computer and use it in GitHub Desktop.
package com.example.SectionedAdapterTest;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Adapter;
import android.widget.BaseAdapter;
import java.util.ArrayList;
import java.util.List;
abstract public class SectionedAdapter extends BaseAdapter {
abstract protected View getHeaderView(String caption, int index, View convertView, ViewGroup parent);
private List<Section> sections = new ArrayList<Section>();
private static int TYPE_SECTION_HEADER = 1;
public SectionedAdapter() {
super();
}
public void addSection(String caption, Adapter adapter) {
sections.add(new Section(caption, adapter));
}
public Object getItem(int position) {
for (Section section : this.sections) {
if (position == 0) {
return (section);
}
int size = section.adapter.getCount() + 1;
if (position < size) {
return (section.adapter.getItem(position - 1));
}
position -= size;
}
return (null);
}
public int getCount() {
int total = 0;
for (Section section : this.sections) {
total += section.adapter.getCount() + 1; // add one for header
}
return (total);
}
public int getViewTypeCount() {
int total = 1; // one for the header, plus those from sections
for (Section section : this.sections) {
total += section.adapter.getViewTypeCount();
}
return (total);
}
public int getItemViewType(int position) {
int typeOffset = TYPE_SECTION_HEADER + 1; // start counting from here
for (Section section : this.sections) {
if (position == 0) {
return (TYPE_SECTION_HEADER);
}
int size = section.adapter.getCount() + 1;
if (position < size) {
return (typeOffset + section.adapter.getItemViewType(position - 1));
}
position -= size;
typeOffset += section.adapter.getViewTypeCount();
}
return (-1);
}
public boolean areAllItemsSelectable() {
return (false);
}
public boolean isEnabled(int position) {
return (getItemViewType(position) != TYPE_SECTION_HEADER);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
int sectionIndex = 0;
for (Section section : this.sections) {
if (position == 0) {
return (getHeaderView(section.caption, sectionIndex,
convertView, parent));
}
int size = section.adapter.getCount() + 1;
if (position < size) {
return (section.adapter.getView(position - 1, convertView,
parent));
}
position -= size;
sectionIndex++;
}
return (null);
}
@Override
public long getItemId(int position) {
return (position);
}
class Section {
String caption;
Adapter adapter;
Section(String caption, Adapter adapter) {
this.caption = caption;
this.adapter = adapter;
}
}
}
package com.example.SectionedAdapterTest;
import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
public class SectionedDemo extends ListActivity {
private static String[] items = { "US", "UK", "CANADA", "JAPAN", "SINGAPORE","INDIA", "CHINA" };
private static String[] Sect = { "GOOGLE", "FACEBOOK","DELL" };
private static String[] Doc = { "FRONT", "TOP","BACK" };
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
adapter.addSection("step 1", new ArrayAdapter(this, android.R.layout.simple_list_item_1, items));
adapter.addSection("Step 2", new ArrayAdapter(this, android.R.layout.simple_list_item_1, Sect));
adapter.addSection("Step 3", new ArrayAdapter(this, android.R.layout.simple_list_item_1, Doc));
setListAdapter(adapter);
}
SectionedAdapter adapter = new SectionedAdapter() {
protected View getHeaderView(String caption, int index, View convertView, ViewGroup parent) {
TextView result = (TextView) convertView;
if (convertView == null) {
result = (TextView) getLayoutInflater().inflate(R.layout.header, null);
}
result.setText(caption);
return (result);
}
};
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment