package com.chrome.codereview.utils;
import android.database.DataSetObserver;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import java.util.ArrayList;
import java.util.List;
/**
* Created by sergeyv on 28/5/14.
*/
public class MergeExpandableListAdapter extends BaseIDExpandableAdapter {
private static class ViewTyper {
ArrayList<Integer> typeSums = new ArrayList<Integer>();
private ViewTyper() {
typeSums.add(0);
}
void addTypes(int typesCount) {
typeSums.add(typesCount() + typesCount);
}
int typeOf(int adapterId, int viewType) {
return typeSums.get(adapterId) + viewType;
}
int typesCount() {
return typeSums.get(typeSums.size() - 1);
}
}
private static class Position {
final BaseExpandableListAdapter adapter;
final int adapterPos;
final int group;
private Position(BaseExpandableListAdapter adapter, int adapterPos, int group) {
this.adapter = adapter;
this.adapterPos = adapterPos;
this.group = group;
}
}
private List<BaseExpandableListAdapter> adapters = new ArrayList<BaseExpandableListAdapter>();
private ViewTyper groupTyper;
private ViewTyper childTyper;
private DataSetObserver observer = new DataSetObserver() {
@Override
public void onChanged() {
notifyDataSetChanged();
}
@Override
public void onInvalidated() {
notifyDataSetInvalidated();
}
};
public MergeExpandableListAdapter(BaseExpandableListAdapter... adapters) {
groupTyper = new ViewTyper();
childTyper = new ViewTyper();
for (BaseExpandableListAdapter adapter: adapters) {
add(adapter);
}
}
public void add(BaseExpandableListAdapter adapter) {
groupTyper.addTypes(adapter.getGroupTypeCount());
childTyper.addTypes(adapter.getChildTypeCount());
adapter.registerDataSetObserver(observer);
adapters.add(adapter);
}
private Position position(int groupPosition) {
int i = 0;
while (groupPosition >= adapters.get(i).getGroupCount()) {
groupPosition -= adapters.get(i).getGroupCount();
i++;
}
return new Position(adapters.get(i), i, groupPosition);
}
@Override
public int getGroupCount() {
int sum = 0;
for (BaseExpandableListAdapter adapter : adapters) {
sum += adapter.getGroupCount();
}
return sum;
}
@Override
public int getChildrenCount(int groupPosition) {
Position position = position(groupPosition);
return position.adapter.getChildrenCount(position.group);
}
@Override
public Object getGroup(int groupPosition) {
Position position = position(groupPosition);
return position.adapter.getGroup(position.group);
}
@Override
public Object getChild(int groupPosition, int childPosition) {
Position position = position(groupPosition);
return position.adapter.getChild(position.group, childPosition);
}
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
Position position = position(groupPosition);
return position.adapter.getGroupView(position.group, isExpanded, convertView, parent);
}
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
Position position = position(groupPosition);
return position.adapter.getChildView(position.group, childPosition, isLastChild, convertView, parent);
}
@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
Position position = position(groupPosition);
return position.adapter.isChildSelectable(position.group, childPosition);
}
@Override
public int getChildType(int groupPosition, int childPosition) {
Position position = position(groupPosition);
return childTyper.typeOf(position.adapterPos, position.adapter.getChildType(position.group, childPosition));
}
@Override
public int getChildTypeCount() {
return childTyper.typesCount();
}
@Override
public int getGroupType(int groupPosition) {
Position position = position(groupPosition);
return groupTyper.typeOf(position.adapterPos, position.adapter.getGroupType(position.group));
}
@Override
public int getGroupTypeCount() {
return groupTyper.typesCount();
}
}