package com.aspsine.swipetoloadlayout.demo.adapter;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import java.util.ArrayList;
import java.util.List;
/**
* Created by aspsine on 15/9/4.
*/
public abstract class BaseGroupAdapter<G, C> extends BaseAdapter {
private List<Integer> mHeaderPositions;
protected OnGroupItemClickListener mOnGroupItemClickListener;
protected OnGroupItemLongClickListener mOnGroupItemLongClickListener;
protected OnChildItemClickListener mOnChildItemClickListener;
protected OnChildItemLongClickListener mOnChildItemLongClickListener;
public void setOnGroupItemClickListener(OnGroupItemClickListener onGroupItemClickListener) {
this.mOnGroupItemClickListener = onGroupItemClickListener;
}
public void setOnGroupItemLongClickListener(OnGroupItemLongClickListener onGroupItemLongClickListener) {
this.mOnGroupItemLongClickListener = onGroupItemLongClickListener;
}
public void setOnChildItemClickListener(OnChildItemClickListener onChildItemClickListener) {
this.mOnChildItemClickListener = onChildItemClickListener;
}
public void setOnChildItemLongClickListener(OnChildItemLongClickListener onChildItemLongClickListener) {
this.mOnChildItemLongClickListener = onChildItemLongClickListener;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getCount() {
int count = 0;
for (int i = 0; i < getGroupCount(); i++) {
count += (getChildCount(i) + 1);
}
return count;
}
@Override
public void notifyDataSetChanged() {
super.notifyDataSetChanged();
initHeaderPositions();
}
@Override
public int getItemViewType(int position) {
if (isPositionHeader(position)) {
return getParentViewType(getGroupPosition(position));
} else {
return getChildViewType(getGroupPosition(position), getChildPositionInGroup(position));
}
}
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public Object getItem(int position) {
int type = getItemViewType(position);
int groupPosition = getGroupPosition(position);
if (type == getParentViewType(groupPosition)) {
return getGroup(groupPosition);
} else if (type == getChildViewType(groupPosition, getChildPositionInGroup(position))) {
return getChild(groupPosition, getChildPositionInGroup(position));
}
return null;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
int type = getItemViewType(position);
int groupPosition = getGroupPosition(position);
if (type == getParentViewType(groupPosition)) {
return getGroupView(groupPosition, convertView, parent);
} else if (type == getChildViewType(groupPosition, getChildPositionInGroup(position))) {
return getChildView(groupPosition, getChildPositionInGroup(position), convertView, parent);
}
return null;
}
public void initHeaderPositions() {
if (mHeaderPositions == null) {
mHeaderPositions = new ArrayList<>();
} else {
mHeaderPositions.clear();
}
int headerPosition = 0;
for (int i = 0; i < getGroupCount(); i++) {
if (i == 0) {
headerPosition = 0;
} else {
headerPosition += getChildCount(i - 1) + 1;
}
mHeaderPositions.add(headerPosition);
}
}
public boolean isPositionHeader(int position) {
return mHeaderPositions.contains(position);
}
public int getGroupPosition(int position) {
int groupPosition = 0;
for (int i = mHeaderPositions.size() - 1; i >= 0; i--) {
if (position >= mHeaderPositions.get(i)) {
groupPosition = i;
break;
}
}
return groupPosition;
}
public int getChildPositionInGroup(int position) {
int groupPosition = getGroupPosition(position);
int absGroupPosition = mHeaderPositions.get(groupPosition);
int childPositionInGroup = position - absGroupPosition - 1;
return childPositionInGroup;
}
protected abstract int getParentViewType(int groupPosition);
public abstract int getGroupCount();
protected abstract G getGroup(int groupPosition);
protected abstract View getGroupView(int groupPosition, View convertView, ViewGroup parent);
protected abstract int getChildViewType(int groupPosition, int childPositionInGroup);
public abstract int getChildCount(int groupPosition);
protected abstract C getChild(int groupPosition, int childPosition);
protected abstract View getChildView(int groupPosition, int childPosition, View convertView, ViewGroup parent);
}