PulltoRefresh下拉刷新,上拉加載

       這幾天需求作完了, 沒什麼事,就本身寫了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);

相關文章
相關標籤/搜索