/** * @author Jonathan */ package com.abewy.android.extended.adapter; import java.util.Collection; import java.util.LinkedList; import java.util.List; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Filter; import android.widget.Filterable; public abstract class MultiTypeAdapter<T> extends BaseAdapter implements Filterable { private List<T> items; private int layoutType; private Filter filter; private boolean isLinkedlist; public MultiTypeAdapter() { this(0); } public MultiTypeAdapter(int layoutType) { super(); this.layoutType = layoutType; items = new LinkedList<T>(); isLinkedlist = true; } public int getCount() { return items != null ? items.size() : 0; } public List<T> getItems() { return items; } public T getItem(int index) { if (index >= 0 && index < items.size()) return items.get(index); return null; } public T getFirstItem() { if (isLinkedlist) return ((LinkedList<T>) items).getFirst(); return getItem(0); } public T getLastItem() { if (isLinkedlist) return ((LinkedList<T>) items).getFirst(); return getItem(items.size() - 1); } @Override public boolean hasStableIds() { return true; } @Override public long getItemId(int position) { return position; } public int getItemPosition(T object) { return items.indexOf(object); } public void add(T object) { items.add(object); } public void addAll(Collection<T> objects) { for (T object : objects) { add(object); } } public void insert(T object, int index) { items.add(index, object); } public void remove(T object) { items.remove(object); notifyDataSetChanged(); } public void removeAt(int index) { items.remove(index); notifyDataSetChanged(); } public void removeFirst() { if (isLinkedlist) ((LinkedList<T>) items).removeFirst(); else items.remove(0); notifyDataSetChanged(); } public void removeLast() { if (isLinkedlist) ((LinkedList<T>) items).removeLast(); else items.remove(items.size() - 1); notifyDataSetChanged(); } public void clear() { clear(true); } public void clear(boolean notify) { items.clear(); if (notify) notifyDataSetChanged(); } public void refill() { List<T> list = new LinkedList<T>(); isLinkedlist = true; list.addAll(items); items.clear(); items.addAll(list); notifyDataSetChanged(); } public void setData(List<T> data) { items = data; isLinkedlist = items instanceof LinkedList; notifyDataSetChanged(); } @Override public int getViewTypeCount() { return 10; } @Override public int getItemViewType(int position) { if (position < 0 || position >= getCount()) return IGNORE_ITEM_VIEW_TYPE; //Log.d("MultiTypeAdapter", "getItemViewType: " + position + " " + getCount()); return getItemViewType(getItem(position)); } @Override public boolean areAllItemsEnabled() { return false; } @Override public boolean isEnabled(int position) { T object = getItem(position); return getAdapter(object, layoutType).isEnabled(object); } @Override public View getView(int position, View convertView, ViewGroup parent) { T object = getItem(position); TypeAdapter<T> adapter = getAdapter(object, layoutType); if (convertView == null) convertView = adapter.createView(parent); adapter.setLayoutParams(convertView); adapter.bindData(convertView, object, position); return convertView; } @Override public View getDropDownView(int position, View convertView, ViewGroup parent) { return getView(position, convertView, parent); } protected abstract TypeAdapter<T> getAdapter(T object, int layoutType); protected abstract int getItemViewType(T object); @Override public Filter getFilter() { return filter; } public void setFilter(Filter filter) { this.filter = filter; } }