package com.hx.hxchat.adapter; import java.util.ArrayList; import java.util.List; import android.content.Context; 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.ArrayAdapter; import android.widget.BaseAdapter; import android.widget.ListView; import com.easemob.chat.EMGroup; import com.hx.hxchat.holder.BaseHolder; import com.hx.hxchat.holder.MoreHolder; import com.mgw.member.manager.ThreadManager; import com.mgw.member.uitls.UIUtils; /** * Created by mwqi on 2014/6/8. */ public abstract class DefaultAdapter<Data> extends BaseAdapter implements RecyclerListener, OnItemClickListener { public DefaultAdapter(Context context, int resource, List<Data> datas,AbsListView listView) { super(); mDisplayedHolders = new ArrayList<BaseHolder>(); mListView = listView; if (null != listView) { //设置 listView.setRecyclerListener(this); listView.setOnItemClickListener(this); } setData(datas); } 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的数据集 private volatile boolean mIsLoading; private MoreHolder mMoreHolder; @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; } // 获取item有几种类型,默认是一种类型,这里在加一是为了做加载更多。 @Override public int getViewTypeCount() { return super.getViewTypeCount() + 1;// 加1是为了最后加载更多的布局 } // 根据position位置返回哪种item展示类型 @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(); } } if (getItemViewType(position) == ITEM_VIEW_TYPE) { holder.setData(mDatas.get(position)); } mDisplayedHolders.add(holder); return holder.getRootView(); } protected abstract BaseHolder getHolder(); public BaseHolder getMoreHolder() { if (mMoreHolder == null) { mMoreHolder = new MoreHolder(this, hasMore()); } return mMoreHolder; } public void loadMore() { //防止重复加载 if (!mIsLoading) { mIsLoading = true; ThreadManager.getLongPool().execute(new Runnable() { @Override public void run() { final List<Data> datas = onLoadMore(); UIUtils.post(new Runnable() { @Override public void run() { if (datas == null) { getMoreHolder().setData(MoreHolder.ERROR); } else if (datas.size() < 20) { getMoreHolder().setData(MoreHolder.NO_MORE); } else { getMoreHolder().setData(MoreHolder.HAS_MORE); } if (datas != null) { if (getData() != null) { getData().addAll(datas); } else { setData(datas); } } notifyDataSetChanged(); mIsLoading = false; } }); } }); } } 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) { } }