package com.itap.voiceemoticon.widget; import com.itap.voiceemoticon.VEApplication; import com.itap.voiceemoticon.adapter.ArrayListAdapter; import com.itap.voiceemoticon.api.PageList; import org.tadpoleframework.widget.adapter.BaseListAdapter; import android.content.Context; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.os.Handler; import android.os.Looper; import android.util.AttributeSet; import android.util.Log; import android.widget.AbsListView.OnScrollListener; import android.widget.LinearLayout; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.Toast; import java.util.ArrayList; public abstract class PageListView<T> extends XListView implements OnScrollListener, XListView.IXListViewListener { private LinearLayout mLoadLayout; private BaseListAdapter<T, ListView> mAdapter; private int mTotalCount; private int mLastItem; private int mStartIndex; public int maxResult = 20; public PageListView(Context context) { super(context); init(); } public PageListView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); } public PageListView(Context context, AttributeSet attrs) { super(context, attrs); init(); } private void init() { setDivider(getResources().getDrawable(org.tadpoleframework.R.drawable.divider)); setSelector(new ColorDrawable(Color.TRANSPARENT)); } @Override public void setAdapter(ListAdapter adapter) { mAdapter = (BaseListAdapter<T, ListView>) adapter; this.setFooterDividersEnabled(false); this.setXListViewListener(this); super.setAdapter(adapter); } public void doLoad(String... args) { super.showFooterLoading(); this.loadData(false); } public void doLoad(boolean isRefresh) { if (isRefresh) { mStartIndex = 0; } if (mStartIndex > mTotalCount) { return; } this.loadData(isRefresh); } public void doRefresh() { this.doLoad(true); } private Handler mHandler = new Handler(Looper.getMainLooper()); private void loadData(final boolean isRefresh) { Log.d(VEApplication.TAG, "loadData startIndex = " + mStartIndex + ", mTotalCount = " + mTotalCount); final PageListView me = this; if (isRefresh) { mStartIndex = 0; } final int toLoadStartIndex = mStartIndex; new Thread(new Runnable() { @Override public void run() { final PageList<T> pageList = me.onLoadPageList(toLoadStartIndex, maxResult); if (pageList == null) { Log.d(VEApplication.TAG, "page list is null"); mHandler.post(new Runnable() { @Override public void run() { Toast.makeText(me.getContext(), "服务器木有数据", Toast.LENGTH_LONG); me.stopRefreshOrLoad(); } }); return; } mStartIndex += maxResult; final BaseListAdapter adapter = mAdapter; final ArrayList list = (ArrayList)adapter.getList(); mTotalCount = pageList.totalCount; mHandler.postDelayed(new Runnable() { @Override public void run() { if (isRefresh && list != null) { list.clear(); adapter.notifyDataSetChanged(); } if (list == null) { adapter.setList(pageList.records); } else { list.addAll(pageList.records); } adapter.notifyDataSetChanged(); me.stopRefreshOrLoad(); } }, 200); } }).start(); } public abstract PageList<T> onLoadPageList(int startIndex, int maxResult); public void onRefresh() { doRefresh(); } public void onLoadMore() { doLoad(); } }