package com.bczm.widgetcollections.ui.adapter;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AbsListView.RecyclerListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ListView;
import com.bczm.widgetcollections.ui.holder.BaseHolder;
import com.bczm.widgetcollections.ui.holder.MoreHolder;
import java.util.ArrayList;
import java.util.List;
/**
* Created by lipan on 2014/6/8.
*/
public abstract class DefaultAdapter<Data> extends BaseAdapter implements RecyclerListener, OnItemClickListener {
public static final int MORE_VIEW_TYPE = 0;
public static final int ITEM_VIEW_TYPE = 1;
protected AbsListView mListView;//和该adapter关联的listView
private List<BaseHolder> mDisplayedHolders;//用于记录所有显示的holder
private List<Data> mDatas;//adapter的数据集
public DefaultAdapter(AbsListView listView, List<Data> datas) {
mDisplayedHolders = new ArrayList<BaseHolder>();
mListView = listView;
if (null != listView) {
//设置
listView.setRecyclerListener(this);
listView.setOnItemClickListener(this);
}
setData(datas);
}
@Override
public void onMovedToScrapHeap(View view) {
if (null != view) {
Object tag = view.getTag();
if (tag instanceof BaseHolder) {
BaseHolder holder = (BaseHolder) tag;
synchronized (mDisplayedHolders) {
mDisplayedHolders.remove(holder);
}
holder.recycle();
}
}
}
public List<BaseHolder> getDisplayedHolders() {
synchronized (mDisplayedHolders) {
return new ArrayList<BaseHolder>(mDisplayedHolders);
}
}
@Override
public long getItemId(int position) {
return position;
}
public void setData(List<Data> datas) {
mDatas = datas;
}
public List<Data> getData() {
return mDatas;
}
@Override
public int getCount() {
if (mDatas != null) {
return mDatas.size() + 1;// 加1是为了最后加载更多的布局
}
return 0;
}
@Override
public Data getItem(int position) {
if (mDatas != null && position < mDatas.size()) {
return mDatas.get(position);
}
return null;
}
public int getHeaderViewCount() {
int count = 0;
if (mListView != null && mListView instanceof ListView) {
ListView listView = (ListView) mListView;
count = listView.getHeaderViewsCount();
}
return count;
}
@Override
public int getViewTypeCount() {
return super.getViewTypeCount() + 1;// 加1是为了最后加载更多的布局
}
@Override
public int getItemViewType(int position) {
if (position == getCount() - 1) {
return MORE_VIEW_TYPE;// 加载更多的布局
} else {
return getItemViewTypeInner(position);
}
}
public int getItemViewTypeInner(int position) {
return ITEM_VIEW_TYPE;// 普通item的布局
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
BaseHolder<Data> holder;
if (convertView != null && convertView.getTag() instanceof BaseHolder) {
holder = (BaseHolder<Data>) convertView.getTag();
} else {
if (getItemViewType(position) == MORE_VIEW_TYPE) {
holder = getMoreHolder();
} else {
holder = getHolder();
holder.setData(mDatas.get(position));
}
}
mDisplayedHolders.add(holder);
return holder.getRootView();
}
protected abstract BaseHolder getHolder();
public BaseHolder getMoreHolder() {
return new MoreHolder(this, hasMore());
}
public int loadMore() {
List<Data> datas = onLoadMore();
if (datas == null) {
return MoreHolder.ERROR;
}
if (getData() != null) {
getData().addAll(datas);
} else {
setData(datas);
}
this.notifyDataSetChanged();
if (datas.size() < 5) {
return MoreHolder.NO_MORE;
} else {
return MoreHolder.HAS_MORE;
}
}
public List<Data> onLoadMore() {
return null;
}
public boolean hasMore() {
return true;
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
position = position - getHeaderViewCount();// 此时的position是加上了header的
onItemClickInner(position);
}
public void onItemClickInner(int position) {
}
}