recyclerView的上拉加載下拉刷新

想把網(wǎng)頁(yè)上的一些效果改成Android上的领迈,就遇到一個(gè)列表的上拉加載和下拉刷新推掸,Android只提供了下拉加載更多SwipeRefreshLayout,但是沒(méi)有直接的下拉加載更多,很頭痛,搜索了下教程豹爹,然后自己思考了下,摸索出一個(gè)相對(duì)簡(jiǎn)單的方法矛纹,(比較簡(jiǎn)陋臂聋,沒(méi)有什么動(dòng)畫,我不會(huì)啊或南。孩等。。采够。)

使用的是RecyclerView+SwiperRefreshLayout,recyclerView具體怎么使用就不用詳細(xì)介紹了

1.上拉刷新:
我直接使用了SwiperRefreshLayout,相對(duì)比較簡(jiǎn)單吧

布局文件:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"">

<android.support.v4.widget.SwipeRefreshLayout
    android:layout_width="match_parent"
    android:id="@+id/refresh"
    android:layout_height="match_parent">
    <android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:id="@+id/list"
        android:layout_height="match_parent"/>

</android.support.v4.widget.SwipeRefreshLayout>

</android.support.constraint.ConstraintLayout>

SwiperRefreshLayout需要設(shè)置onRefreshListener: setOnRefreshListener 在onRefresh中設(shè)置刷新的操作肄方,另外需要setRefreshing(false); 不然刷新的圖標(biāo)一直都在

2、下拉加載更多:
由于recyclerview沒(méi)有addfooterview 所以我們要自己添加:
在adapter中

@Override
public int getItemCount() {
return mList.size()+1;
}
需要在原有的長(zhǎng)度上+1蹬癌,來(lái)存放下拉加載更多的view

@Override
public int getItemViewType(int position) {
return position==mList.size()?1:0;
}

然后再 getItemViewType方法中設(shè)置viewType 用來(lái)區(qū)分不同的View

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view=null;
if(viewType==0){
view= LayoutInflater.from(parent.getContext()).inflate(R.layout.item,parent,false);
}else {
view= LayoutInflater.from(parent.getContext()).inflate(R.layout.load,parent,false);
}
view.setTag(viewType);
return new ViewHolder(view);
}
接著在onCreateViewHolder 方法中 區(qū)分viewType 用不同的View

然后運(yùn)行权她,出現(xiàn)了底部的加載更多,但是現(xiàn)在還沒(méi)有效果(原諒我沒(méi)有圖 逝薪,真的不好傳隅要,照這種換個(gè)方法應(yīng)該能看到吧。董济。步清。)

接下來(lái)就是最重要的加載更多的功能了

重寫 OnScrollListener 來(lái)監(jiān)聽(tīng)滑動(dòng)事件
mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
}

        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
        }
    });

官方介紹:

/**
* Callback method to be invoked when RecyclerView's scroll state changes.
*
* @param recyclerView The RecyclerView whose scroll state has changed.
* @param newState The updated scroll state. One of {@link #SCROLL_STATE_IDLE},
* {@link #SCROLL_STATE_DRAGGING} or {@link #SCROLL_STATE_SETTLING}.
*/
說(shuō)明:onScrollStateChanged:當(dāng)recyclerview滑動(dòng)狀態(tài)改變時(shí)調(diào)用 有暗中狀態(tài)
SCROLL_STATE_IDLE:滑動(dòng)停止時(shí)
SCROLL_STATE_DRAGGING:觸摸拖動(dòng)時(shí)
SCROLL_STATE_SETTLING:拖動(dòng)到最后,不受外界影響

onScrolled:recyclerview滑動(dòng)時(shí) 調(diào)用的方法

問(wèn)題的關(guān)鍵:需要在recyclerview滑動(dòng)到最后一個(gè)視圖的時(shí)候 調(diào)用加載更多的方法

拆分問(wèn)題:
什么時(shí)候算是滑到底部虏肾?
那么必須使用onScrolled方法 廓啊,layoutManager中有一個(gè)方法findLastVisibleItemPosition()
可以找到屏幕最后一個(gè)顯示的itemview,返回的是它的位置
(layoutManager 是 mRecyclerView.setLayoutManager(layoutManager); 這里的layoutManager,我已開(kāi)始默認(rèn)使用了LinearLayoutManager)

那么就是當(dāng)findLastVisibleItemPosition==(adapter.getItemCount()-1)(position從0開(kāi)始)
的時(shí)候询微,就可以操作了 但是并不是最后一個(gè)加載更多的視圖出來(lái)崖瞭,我們就可以刷新了,你會(huì)發(fā)現(xiàn)有很多app都是可以選擇的撑毛,比如我在滑動(dòng)時(shí)會(huì)提示我松手加載更多之類书聚,喲普寫也是當(dāng)你滑動(dòng)是字會(huì)發(fā)生來(lái)提示你刷新,所以我選擇的是 當(dāng)最后一個(gè)itemView 上啦超過(guò)80px的時(shí)候藻雌,現(xiàn)在是可以加載更多的狀態(tài) 但是 他需要松手停止滑動(dòng)后才可以雌续,當(dāng)他超過(guò)80px后,又向上滑回去了胯杭,那么就不執(zhí)行加載更多的操作:

這是我重寫的方法:

        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            if(layoutManager.findLastVisibleItemPosition()==mRefreshAdapter.getItemCount()-1){

                View view1=layoutManager.findViewByPosition(mRefreshAdapter.getItemCount()-1);
                TextView textView=view1.findViewById(R.id.text);
                if(recyclerView.getHeight()-view1.getTop()>80){
  //當(dāng)超過(guò)80的時(shí)候 設(shè)置isRefresh=true驯杜,代表可以松手后滑動(dòng)刷新了
                    textView.setText("正在加載內(nèi)容");
                   isRefresh=true;
                }else {

//如果這個(gè)時(shí)候又向上滑 導(dǎo)致 最后一個(gè)itemview露出的部分小于80做个,那么就不可以滑動(dòng)了
textView.setText("上拉加載更多");
isRefresh=false;
}

            }
        }

@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
//加載更多的操作顽频,當(dāng)滑動(dòng)停止又可以刷新的時(shí)候 我們使用 loadMore()加載新數(shù)據(jù)
if((newState==RecyclerView.SCROLL_STATE_IDLE) && isRefresh){
//首先緩慢平移到 可以添加動(dòng)畫 有一個(gè)回單效果
recyclerView.smoothScrollBy(0,-200);
loadMore();
isRefresh=false;

            }

        }

接著又遇到了一個(gè)更加嚴(yán)重的問(wèn)題,如果使用的是GridLayoutManager呢最住,每行兩個(gè),那么這個(gè)怎么獨(dú)占一行仗岖?還有可不可以使用同樣的方法來(lái)做下拉刷險(xiǎn)轧拄,就不需要用SwipeRefreshLayout府树,并且還可以封裝成一個(gè)獨(dú)立的VIew

下次更新卓箫,睡覺(jué)了,困

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末弯洗,一起剝皮案震驚了整個(gè)濱河市藐吮,隨后出現(xiàn)的幾起案子迫摔,更是在濱河造成了極大的恐慌,老刑警劉巖卓起,帶你破解...
    沈念sama閱讀 211,817評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奕筐,死亡現(xiàn)場(chǎng)離奇詭異芭逝,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門培他,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人员萍,你說(shuō)我怎么就攤上這事腾降。” “怎么了碎绎?”我有些...
    開(kāi)封第一講書人閱讀 157,354評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵螃壤,是天一觀的道長(zhǎng)抗果。 經(jīng)常有香客問(wèn)我,道長(zhǎng)奸晴,這世上最難降的妖魔是什么冤馏? 我笑而不...
    開(kāi)封第一講書人閱讀 56,498評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮寄啼,結(jié)果婚禮上逮光,老公的妹妹穿的比我還像新娘。我一直安慰自己墩划,他們只是感情好涕刚,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,600評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著乙帮,像睡著了一般杜漠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上察净,一...
    開(kāi)封第一講書人閱讀 49,829評(píng)論 1 290
  • 那天驾茴,我揣著相機(jī)與錄音,去河邊找鬼氢卡。 笑死锈至,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的译秦。 我是一名探鬼主播裹赴,決...
    沈念sama閱讀 38,979評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼诀浪!你這毒婦竟也來(lái)了棋返?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,722評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤雷猪,失蹤者是張志新(化名)和其女友劉穎睛竣,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體求摇,經(jīng)...
    沈念sama閱讀 44,189評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡射沟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,519評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了与境。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片验夯。...
    茶點(diǎn)故事閱讀 38,654評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖摔刁,靈堂內(nèi)的尸體忽然破棺而出挥转,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布绑谣,位于F島的核電站党窜,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏借宵。R本人自食惡果不足惜幌衣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,940評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望壤玫。 院中可真熱鬧豁护,春花似錦、人聲如沸欲间。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,762評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)括改。三九已至,卻和暖如春家坎,著一層夾襖步出監(jiān)牢的瞬間嘱能,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,993評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工虱疏, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留惹骂,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,382評(píng)論 2 360
  • 正文 我出身青樓做瞪,卻偏偏與公主長(zhǎng)得像对粪,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子装蓬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,543評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容