diff options
author | Alexander Sulfrian <alexander@sulfrian.net> | 2010-08-17 01:56:11 +0200 |
---|---|---|
committer | Alexander Sulfrian <alexander@sulfrian.net> | 2010-08-17 02:19:39 +0200 |
commit | d773a39a1f07ae4b8021222a47c16b048d7fd435 (patch) | |
tree | 3558cbd77c8e6aa54f5593b556fcbf330fea0120 /src/de/animux/android/andmal/util | |
download | AndMAL-d773a39a1f07ae4b8021222a47c16b048d7fd435.tar.gz AndMAL-d773a39a1f07ae4b8021222a47c16b048d7fd435.tar.xz AndMAL-d773a39a1f07ae4b8021222a47c16b048d7fd435.zip |
initial commit
Diffstat (limited to 'src/de/animux/android/andmal/util')
-rw-r--r-- | src/de/animux/android/andmal/util/SeparatedListAdapter.java | 116 | ||||
-rw-r--r-- | src/de/animux/android/andmal/util/SortedLinkedList.java | 40 |
2 files changed, 156 insertions, 0 deletions
diff --git a/src/de/animux/android/andmal/util/SeparatedListAdapter.java b/src/de/animux/android/andmal/util/SeparatedListAdapter.java new file mode 100644 index 0000000..6320b0f --- /dev/null +++ b/src/de/animux/android/andmal/util/SeparatedListAdapter.java @@ -0,0 +1,116 @@ +package de.animux.android.andmal.util; + +import java.util.LinkedHashMap; +import java.util.Map; + +import de.animux.android.andmal.R; + +import android.content.Context; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Adapter; +import android.widget.ArrayAdapter; +import android.widget.BaseAdapter; + +public class SeparatedListAdapter extends BaseAdapter { + + public final Map<String, Adapter> sections = new LinkedHashMap<String, Adapter>(); + + public final ArrayAdapter<String> headers; + + public final static int TYPE_SECTION_HEADER = 0; + + public SeparatedListAdapter(Context context) { + headers = new ArrayAdapter<String>(context, R.layout.list_header); + } + + public void addSection(String section, Adapter adapter) { + this.headers.add(section); + this.sections.put(section, adapter); + } + + public Object getItem(int position) { + for (Object section : this.sections.keySet()) { + Adapter adapter = sections.get(section); + int size = adapter.getCount() + 1; + + // check if position inside this section + if (position == 0) + return section; + if (position < size) + return adapter.getItem(position - 1); + + // otherwise jump into next section + position -= size; + } + return null; + } + + public int getCount() { + // total together all sections, plus one for each section header + int total = 0; + for (Adapter adapter : this.sections.values()) + total += adapter.getCount() + 1; + return total; + } + + public int getViewTypeCount() { + // assume that headers count as one, then total all sections + int total = 1; + for (Adapter adapter : this.sections.values()) + total += adapter.getViewTypeCount(); + return total; + } + + public int getItemViewType(int position) { + int type = 1; + for (Object section : this.sections.keySet()) { + Adapter adapter = sections.get(section); + int size = adapter.getCount() + 1; + + // check if position inside this section + if (position == 0) + return TYPE_SECTION_HEADER; + if (position < size) + return type + adapter.getItemViewType(position - 1); + + // otherwise jump into next section + position -= size; + type += 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 sectionnum = 0; + for (Object section : this.sections.keySet()) { + Adapter adapter = sections.get(section); + int size = adapter.getCount() + 1; + + // check if position inside this section + if (position == 0) + return headers.getView(sectionnum, convertView, parent); + if (position < size) + return adapter.getView(position - 1, convertView, parent); + + // otherwise jump into next section + position -= size; + sectionnum++; + } + return null; + } + + @Override + public long getItemId(int position) { + return position; + } +}
\ No newline at end of file diff --git a/src/de/animux/android/andmal/util/SortedLinkedList.java b/src/de/animux/android/andmal/util/SortedLinkedList.java new file mode 100644 index 0000000..974d3e5 --- /dev/null +++ b/src/de/animux/android/andmal/util/SortedLinkedList.java @@ -0,0 +1,40 @@ +package de.animux.android.andmal.util; + +import java.util.Collection; +import java.util.LinkedList; +import java.util.ListIterator; + +public class SortedLinkedList<T extends Comparable<T>> extends LinkedList<T> { + + private static final long serialVersionUID = 8263372892230475461L; + + @Override + public boolean add(T object) { + ListIterator<T> it = listIterator(); + while (it.hasNext()) { + if (object.compareTo(it.next()) > 0) { + break; + } + } + + if (it.hasPrevious()) { + it.previous(); + it.add(object); + } + else { + // insert at first position + listIterator().add(object); + } + + return true; + } + + @Override + public boolean addAll(Collection<? extends T> collection) { + for (T object : collection) { + add(object); + } + + return true; + } +} |