編寫(xiě)一個(gè)帶有加載更多的通用的listview adapter

import android.content.Context;
import android.support.v4.widget.SwipeRefreshLayout;
import android.util.SparseArray;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.ListView;

import java.util.List;

/**
 * Created by Administrator on 2016/2/26 0026.
 */
public abstract class BaseListViewAdapter<T> extends BaseAdapter {
    private List<T> list;
    protected Context context;

    private LoadMoreListener loadMoreListener;//加載更多接口

    public boolean isLoading = false;//是否正在加載
    private int currentPage = 0;//當(dāng)前頁(yè)
    private boolean isFirstLoad = true;//是否第一次調(diào)用網(wǎng)絡(luò)數(shù)據(jù)

    public void setRefreshAndLoadMoreListener(ListView listView, LoadMoreListener listener) {
        this.loadMoreListener = listener;

        listView.setOnScrollListener(new AbsListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {

            }

            @Override
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                //正在加載數(shù)據(jù)時(shí)禁止再次加載
                if (isLoading) {
                    return;
                }
                //當(dāng)本地?cái)?shù)據(jù)和網(wǎng)絡(luò)數(shù)據(jù)一致時(shí)不再加載
                if (!isFirstLoad&&getCount() >= loadMoreListener.getAllQueryItemCount()) {
                    return;
                }
                if (firstVisibleItem + visibleItemCount + loadMoreListener.getReverseItemIndexLoadMore() > totalItemCount + 1) {
                    isLoading = true;
                    loadMoreListener.loadMore(currentPage + 1);
                }
            }
        });
    }

    /**
     * 第一次加載或者刷新時(shí)需要調(diào)用
     */
    public void startRefresh() {
        isLoading = true;
    }

    /**
     * 第一次加載或者刷新后需要調(diào)用
     * @param success
     */
    public void refreshResult(boolean success) {

        if (success) {
            currentPage = 0;
            isFirstLoad = false;
        }
        isLoading = false;
        notifyDataSetChanged();
    }
    /**
     * 加載更多后需要調(diào)用
     * @param success
     */
    public void loadMoreResult(boolean success) {
        if (success) {
            currentPage++;
            isFirstLoad = false;
        }
        isLoading = false;
        notifyDataSetChanged();
    }

    public BaseListViewAdapter(List<T> list, Context context) {
        this.list = list;
        this.context = context;
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            holder = new ViewHolder();
            convertView = getItemViewResource();
            recordAllWidget(holder.sparseArray, convertView);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        bindItemData(holder.sparseArray, list.get(position), position);
        return convertView;
    }
    //重新此方法返回root view
    public abstract View getItemViewResource();
    //在這個(gè)方法中進(jìn)行view和數(shù)據(jù)的綁定
    public abstract void bindItemData(SparseArray<View> sparseArray, T t, int position);
  //sparseArray中需要根據(jù)id記錄下所有需要用到的子view
    public abstract void recordAllWidget(SparseArray<View> sparseArray, View main);


    class ViewHolder {
        public SparseArray<View> sparseArray = new SparseArray();
    }


    interface LoadMoreListener {
        /**
         * 返回網(wǎng)絡(luò)上查詢的所有記錄數(shù)
         *
         * @return
         */
        int getAllQueryItemCount();

        /**
         * 距離剩下幾個(gè)item開(kāi)始自動(dòng)加載更多
         *
         * @return
         */
        int getReverseItemIndexLoadMore();

        /**
         * 加載下一頁(yè)
         *
         * @param currentPage
         */
        void loadMore(int currentPage);
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容