MultiStateRefreshLayout

android官方的SwipeRefreshlayout控件不支持上拉加载,于是修改了MultiStateView的部分代码,做为listView的footview,封装成了这个可以加载更多的控件,且footview的状态可以改变。

地址:https://github.com/fantianwen/MultiStateRefreshLayout

  • 支持ListView
  • 支持footView改变状态

使用方法



    

代码中:

 multiRefreshLayout = (MultiStateRefreshLayout) findViewById(R.id.multiRefreshLayout);
        multiRefreshLayout.setColorSchemeColors(Color.GREEN);

        mListView = multiRefreshLayout.getListView();
        multiRefreshLayout.setListView(mListView);

        myAdapter = new MyAdapter(this, mLists);
        mListView.setAdapter(myAdapter);

        multiRefreshLayout.setOnLoadingListener(new MultiStateRefreshLayout.OnLoadingListener() {
            @Override
            public void onLoadMore() {
                // 加载更多
            }
        });
        multiRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
               // 刷新
            }
        });
        multiRefreshLayout.setOnSucessFootClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 点击footView的加载加载更多
            }
        });

实现原理

关键代码:

public void setListView(final ListView mListView) {
        this.mListView = mListView;

        mListView.setOnScrollListener(new AbsListView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
                switch (scrollState) {
                    case SCROLL_STATE_FLING:
                        break;
                    case SCROLL_STATE_IDLE:
                        //监听是都能够上拉刷新
                        if (canRefresh()) {
                            setEnabled(true);
                        } else {
                            setEnabled(false);
                        }
                        //监听能够上拉加载更多
                        if (canLoadMore(scrollState)) {
                            loadData();
                        }
                        break;
                }
            }

            @Override
            public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {

            }
        });

    }

其实主要解决的问题就是SwipeRefreshLayout的下拉操作会和ListView的下拉操作相冲突,我们只要在ListView的scrollListener中进行判断:

 case SCROLL_STATE_IDLE:
                        //监听是都能够上拉刷新
                        if (canRefresh()) {
                            setEnabled(true);
                        } else {
                            setEnabled(false);
                        }
                        //监听能够上拉加载更多
                        if (canLoadMore(scrollState)) {
                            loadData();
                        }
                        break;

其中canRefresh()代码如下:

private boolean canRefresh() {
        return isTop();
    }

    private boolean isTop() {
        if (mListView.getCount() > 0) {
            if (mListView.getFirstVisiblePosition() == 0
                    && mListView.getChildAt(0).getTop() >= mListView.getTop()) {
                return true;
            }
        }
        return false;
    }

不足

改变状态需要自主代码调用实现,因为SwipeRefreshLayout不能够判断已经刷新完毕,这点比较不人性化。

你可能感兴趣的:(MultiStateRefreshLayout)