這幾天需求作完了, 沒什麼事,就本身寫了demo,其中用到了下拉刷新,上拉加載更多,作個總結,但願對須要的人有所幫助java
1 . Pulltorefresh是個三方庫,用的時候因此須要先從github上down下來,以下地址: https://github.com/chrisbanes/Android-PullToRefreshandroid
2 . down下來後,發現裏面有三個文件夾,咱們只須要把library這個文件夾導入Eclipse(由於咱們公司的項目一直用的是Eclipse作開發),導入進去後要把library做爲一個依賴庫git
3 . 而後咱們須要在本身的項目中引入這個依賴庫github
4 . 引入佈局ide
<com.handmark.pulltorefresh.library.PullToRefreshListView xmlns:ptr="http://schemas.android.com/apk/res-auto" android:id="@+id/lv_chat" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:divider="#00000000" ptr:ptrDrawable="@android:drawable/ic_delete" ptr:ptrHeaderTextColor="#D7D7D7" > </com.handmark.pulltorefresh.library.PullToRefreshListView>
5 . 若是不設置的話,默認是隻支持下拉刷新的,因此若是須要,咱們須要設置Mode,來改變是否支持上拉加載,佈局
private void setRefreshStyle() { /* BOTH:上拉刷新和下拉刷新都支持 * DISABLED:禁用上拉下拉刷新 * PULL_FROM_START:僅支持下拉刷新(默認) * PULL_FROM_END:僅支持上拉刷新 * MANUAL_REFRESH_ONLY:只容許手動觸發 */ //設置下拉刷新和上拉加載更多 都支持 lv_chat.setMode(Mode.BOTH); ILoadingLayout downPull = lv_chat.getLoadingLayoutProxy(true,false); downPull.setPullLabel("下拉刷新"); downPull.setRefreshingLabel("正在刷新中..."); downPull.setReleaseLabel("釋放便可刷新"); ILoadingLayout upPull = lv_chat.getLoadingLayoutProxy(false, true); upPull.setPullLabel("上拉加載更多"); upPull.setRefreshingLabel("正在玩命加載中..."); upPull.setReleaseLabel("釋放便可加載數據"); }
6 . 而後設置監聽,setOnRefreshListener,我的感受這裏挺坑的,也多是我本身用的問題....這裏的監聽有兩個回調,new OnRefreshListener2<ListView>和new OnRefreshListener<ListView> ,起初我用的是OnRefreshListener2這個監聽,由於這個好用,他裏面直接就有了兩個方法,直接對應上拉和下拉作處理就好code
OnRefreshListener2<ListView> refreshListener1 = new OnRefreshListener2<ListView>(){ @Override public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) { lv_chat.getLoadingLayoutProxy().setRefreshingLabel("正在刷新"); lv_chat.getLoadingLayoutProxy().setPullLabel("下拉刷新"); lv_chat.getLoadingLayoutProxy().setReleaseLabel("釋放開始刷新"); // 下拉刷新 new MyTask().execute(); } @Override public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) { lv_chat.getLoadingLayoutProxy().setPullLabel("上拉加載更多"); lv_chat.getLoadingLayoutProxy().setRefreshingLabel("正在玩命加載中..."); lv_chat.getLoadingLayoutProxy().setReleaseLabel("釋放便可加載數據"); // 上拉加載 new MyTask().execute(); } };
可是,當上拉加載更多的時候,在最後一次上拉 ,也就是無數據加載的時候, "正在玩命加載中...."這個是不會消失的,lv_chat.onRefreshComplete();這個通知刷新完畢的方法加了後仍是不能消失,一直搞不懂爲何,後來用了OnRefreshListener這個回調,不過想用這個的話,須要在源碼中也就是PullToRefreshBase這個類中作一點修改,添加兩個方法xml
//判別頭部是否展現出來,若是展現出來表明下拉使得頭部展現。true爲下拉 public boolean isShownHeader() { return getHeaderLayout().isShown(); } //判別低部是否展現出來,若是展現出來表明上拉使得低部展現。true爲上拉 public boolean isShownFooter() { return getFooterLayout().isShown(); }
而後用的時候,根據是否顯示頭和腳來判斷ip
OnRefreshListener<ListView> refreshListener = new OnRefreshListener<ListView>(){ @Override public void onRefresh(PullToRefreshBase<ListView> refreshView) { if (refreshView.isShownHeader()) { // 下拉刷新 new MyTask().execute(); } if (refreshView.isShownFooter()) { // 上拉加載 new MyTask().execute(); } } };
這樣在上拉時加載到沒數據時候 就會消失了,我的開發
class MyTask extends AsyncTask<Void, Integer, List<EMMessage> >{ @Override protected List<EMMessage> doInBackground(Void... params) { try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } return allMessages; } @Override protected void onPostExecute(List<EMMessage> result) { super.onPostExecute(result); List<EMMessage> subList; if (result.size()>currentIndex) { subList = result.subList(0,currentIndex); //從返回的數據中截取出每次要加載的數目 }else{ subList = result; } int start = index; int end = start + subList.size(); if (end > result.size()) { end = result.size(); } for (int i = start; i < end; i++) { TalkingBean bean = new TalkingBean(); String from = conversation.getMessage(i).getFrom(); MessageBody body = conversation.getMessage(i).getBody(); if(talkToPeople.equals(from)){ bean.setFlag("1"); }else{ bean.setFlag("0"); } bean.setMessage(body.toString().substring(5,body.toString().length()-1)); list.add(bean); } index = end; handler.sendEmptyMessage(999); lv_chat.onRefreshComplete();;//數據加載到適配器完成後,刷新完成, } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); } } OnClickListener backListener = new OnClickListener() { @Override public void onClick(View v) { finish(); } };
感受挺坑的,搞了很久才發現這個問題, 也多是我瞭解的少吧,求大神們指點
//這是pulltorefreshlistview自動滾動到最後一行,小技能點 lv_chat.getRefreshableView().setStackFromBottom(true);