自定義上拉加載更多的ListView配合SwipeRefreshLayout實現列表刷新加載

效果圖如下:

效果圖

1,自定義ListView

import android.content.Context;
import android.support.v4.content.ContextCompat;
import android.util.AttributeSet;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ListView;

/**
 * Created by HeDongDong on 2017/3/29.
 */

public class MyListView extends ListView implements OnScrollListener {

    private LoadMoreListener loadMoreListener;
    //是否可加載更多
    private boolean canLoadMore = true;
    //加載更多佈局
    private LoadingMoreFooter loadingMoreFooter;
    //正在加載數據中
    private boolean isLoadingData = false;
    private int firstVisibleItem;

    public MyListView(Context context) {
        super(context, null);
        init(context);
    }

    public MyListView(Context context, AttributeSet attrs) {
        super(context, attrs, 0);
        init(context);
    }

    public MyListView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context);
    }

    private void init(Context context) {
        loadingMoreFooter = new LoadingMoreFooter(context);
        //設置自定義加載中效果
        ProgressView progressView = new ProgressView(context);
        progressView.setIndicatorId(ProgressView.BallPulse); //動畫效果 自己可以嘗試各種風格
        progressView.setIndicatorColor(ContextCompat.getColor(context, R.color.colorAccent));//動畫顏色
        loadingMoreFooter.addFootLoadingView(progressView);
    }

    //移除加載更多佈局
    public void removeFooter() {
        canLoadMore = false;
        this.removeFooterView(loadingMoreFooter);
    }

    //添加加載更多佈局 在removeFooter()後調用
    public void addFooter() {
        canLoadMore = true;
        this.addFooterView(loadingMoreFooter);
    }

    //下拉刷新後初始化底部狀態
    public void refreshComplete() {
        if (loadingMoreFooter != null) {
            loadingMoreFooter.setGone();
        }
        isLoadingData = false;
    }

    //上拉加載後初始化底部狀態
    public void loadMoreComplete() {
        if (loadingMoreFooter != null) {
            loadingMoreFooter.setGone();
        }
        isLoadingData = false;
    }


    //到底了
    public void loadMoreEnd() {
        if (loadingMoreFooter != null) {
            loadingMoreFooter.setEnd();
        }
    }

    //設置底部加載中效果
    public void setFootLoadingView(View view) {
        if (loadingMoreFooter != null) {
            loadingMoreFooter.addFootLoadingView(view);
        }
    }

    //設置加載更多監聽
    public void setLoadMoreListener(LoadMoreListener listener) {
        loadMoreListener = listener;
        addFooterView(loadingMoreFooter);
        loadingMoreFooter.setGone();
        setOnScrollListener(this);
    }

    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        //判斷 isLoadingData:不在加載中 ,scrollState:整個滾動事件結束,firstVisibleItem:條目至少上滑一條  canLoadMore:可以加載更多
        if (!isLoadingData && scrollState == OnScrollListener.SCROLL_STATE_IDLE &&
                firstVisibleItem != 0 && canLoadMore) {
            if (loadMoreListener != null) {
                if (loadingMoreFooter != null) {
                    loadingMoreFooter.setVisible();
                }
                isLoadingData = true;
                loadMoreListener.onLoadMore();
            }
        }
    }

    @Override
    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int
            totalItemCount) {
        //firstVisibleItem表示在屏幕第一個ListItem(部分顯示的ListItem也算)在整個ListView的位置(下標從0開始)
        this.firstVisibleItem = firstVisibleItem;
    }
}

2,用法

import android.os.Bundle;
import android.os.Handler;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.AppCompatActivity;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private SwipeRefreshLayout swipeRefreshLayout;
    private MyListView myListView;
    private List<String> list = new ArrayList();
    private MainAdapter adapter;
    private int mIndex = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.srl);
        //設置圈圈顏色
        swipeRefreshLayout.setColorSchemeResources(R.color.colorPrimary,
                R.color.colorAccent, R.color.colorPrimary,
                R.color.colorAccent);

        myListView = (MyListView) findViewById(R.id.lv);
        adapter = new MainAdapter(this, list);
        myListView.setAdapter(adapter);

        generateData();
        setOnClickListener();

    }

    private void setOnClickListener() {
        /**
         * 下拉刷新
         */
        swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        mIndex = 0;
                        list.clear();
                        generateData();
                        adapter.notifyDataSetChanged();
                        //刷新完成
                        swipeRefreshLayout.setRefreshing(false);
                        myListView.refreshComplete();
                    }
                }, 1500);
            }
        });

        /**
         * 上拉加載更多
         */
        myListView.setLoadMoreListener(new LoadMoreListener() {
            @Override
            public void onLoadMore() {
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        if (mIndex < 30) {
                            generateData();
                            adapter.notifyDataSetChanged();
                            //設置loading完成
                            myListView.loadMoreComplete();
                        } else {
                            //設置加載到底
                            myListView.loadMoreEnd();
                        }
                    }
                }, 1500);

            }
        });

    }

    /**
     * 生成數據
     */
    private void generateData() {
        for (int i = 0; i < 15; i++) {
            list.add("數據" + mIndex++);
        }
    }
}

3,其中加載效果使用的是開源庫 在Module gradle加上

 compile 'com.wang.avi:library:1.0.1'

4, 詳見demo

DEMO下載鏈接

最後感謝fangxiao大神,從他的Haorecyclerview中吸取很多東西!卻忘了鏈接,知道的幫忙貼一下,謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章