MultiStateRefreshLayout

android官方的SwipeRefreshlayout控件不支持上拉加載,于是修改了MultiStateView的部分代碼,做為listView的footview,封裝成了這個(gè)可以加載更多的控件,且footview的狀態(tài)可以改變。

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

  • 支持ListView
  • 支持footView改變狀態(tài)

使用方法

<van.tian.wen.multirefreshlayout.MultiStateRefreshLayout
        android:id="@+id/multiRefreshLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        van:emptyView="@layout/emptylayout"
        van:errorView="@layout/errorlayout"
        van:listView="@layout/lv"
        van:loadingView="@layout/loadinglayout"
        van:successView="@layout/successlayout"
        van:unknownView="@layout/unknownlayout">

    </van.tian.wen.multirefreshlayout.MultiStateRefreshLayout>

代碼中:

 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) {
                // 點(diǎn)擊footView的加載加載更多
            }
        });

實(shí)現(xiàn)原理

關(guān)鍵代碼:

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:
                        //監(jiān)聽(tīng)是都能夠上拉刷新
                        if (canRefresh()) {
                            setEnabled(true);
                        } else {
                            setEnabled(false);
                        }
                        //監(jiān)聽(tīng)能夠上拉加載更多
                        if (canLoadMore(scrollState)) {
                            loadData();
                        }
                        break;
                }
            }

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

            }
        });

    }

其實(shí)主要解決的問(wèn)題就是SwipeRefreshLayout的下拉操作會(huì)和ListView的下拉操作相沖突,我們只要在ListView的scrollListener中進(jìn)行判斷:

 case SCROLL_STATE_IDLE:
                        //監(jiān)聽(tīng)是都能夠上拉刷新
                        if (canRefresh()) {
                            setEnabled(true);
                        } else {
                            setEnabled(false);
                        }
                        //監(jiān)聽(tīng)能夠上拉加載更多
                        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;
    }

不足

改變狀態(tài)需要自主代碼調(diào)用實(shí)現(xiàn),因?yàn)?code>SwipeRefreshLayout不能夠判斷已經(jīng)刷新完畢,這點(diǎn)比較不人性化。

最后編輯于
?著作權(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)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,724評(píng)論 25 709
  • 內(nèi)容抽屜菜單ListViewWebViewSwitchButton按鈕點(diǎn)贊按鈕進(jìn)度條TabLayout圖標(biāo)下拉刷新...
    皇小弟閱讀 47,133評(píng)論 22 665
  • 昨天下午我見(jiàn)到好久未見(jiàn)曉波兄弟,他一見(jiàn)我就說(shuō):吳哥,飛出的鴿子帶回了“伴”,我大惑不解,他就給我慢慢地說(shuō)開(kāi)了事情的...
    吳老西閱讀 619評(píng)論 1 3
  • 原本是沒(méi)這么在意的,但是這幾天微博微信被周杰倫結(jié)婚刷屏了,到處都是關(guān)于周杰倫婚禮如何華麗以及昆凌如何幸運(yùn)的言論,...
    酸奶兔子3979閱讀 12,280評(píng)論 150 150
  • 今天天氣很好就出去玩了,頂著大太陽(yáng)到了朋友家,朋友家有一只狗,它的名字叫肉肉,因?yàn)槲液芟矚g和小動(dòng)物玩,所...
    Lyan_w7閱讀 453評(píng)論 5 4

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