编写一个带有加载更多的通用的listview adapter

2016-03-31  本文已影响177人  Tenny1225
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;//当前页
    private boolean isFirstLoad = true;//是否第一次调用网络数据

    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) {
                //正在加载数据时禁止再次加载
                if (isLoading) {
                    return;
                }
                //当本地数据和网络数据一致时不再加载
                if (!isFirstLoad&&getCount() >= loadMoreListener.getAllQueryItemCount()) {
                    return;
                }
                if (firstVisibleItem + visibleItemCount + loadMoreListener.getReverseItemIndexLoadMore() > totalItemCount + 1) {
                    isLoading = true;
                    loadMoreListener.loadMore(currentPage + 1);
                }
            }
        });
    }

    /**
     * 第一次加载或者刷新时需要调用
     */
    public void startRefresh() {
        isLoading = true;
    }

    /**
     * 第一次加载或者刷新后需要调用
     * @param success
     */
    public void refreshResult(boolean success) {

        if (success) {
            currentPage = 0;
            isFirstLoad = false;
        }
        isLoading = false;
        notifyDataSetChanged();
    }
    /**
     * 加载更多后需要调用
     * @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();
    //在这个方法中进行view和数据的绑定
    public abstract void bindItemData(SparseArray<View> sparseArray, T t, int position);
  //sparseArray中需要根据id记录下所有需要用到的子view
    public abstract void recordAllWidget(SparseArray<View> sparseArray, View main);


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


    interface LoadMoreListener {
        /**
         * 返回网络上查询的所有记录数
         *
         * @return
         */
        int getAllQueryItemCount();

        /**
         * 距离剩下几个item开始自动加载更多
         *
         * @return
         */
        int getReverseItemIndexLoadMore();

        /**
         * 加载下一页
         *
         * @param currentPage
         */
        void loadMore(int currentPage);
    }
}
上一篇下一篇

猜你喜欢

热点阅读