欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

PulltoRefresh下拉刷新,上拉加载

程序员文章站 2024-03-17 11:33:34
...

       这几天需求做完了, 没什么事,就自己写了demo,其中用到了下拉刷新,上拉加载更多,做个总结,希望对需要的人有所帮助

        1 . Pulltorefresh是个三方库,用的时候所以需要先从github上down下来,如下地址: https://github.com/chrisbanes/Android-PullToRefresh

   2 . down下来后,发现里面有三个文件夹,我们只需要把library这个文件夹导入Eclipse(因为我们公司的项目一直用的是Eclipse做开发),导入进去后要把library作为一个依赖库

PulltoRefresh下拉刷新,上拉加载

   3 . 然后我们需要在自己的项目中引入这个依赖库

PulltoRefresh下拉刷新,上拉加载

   4 . 引入布局

 <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这个监听,因为这个好用,他里面直接就有了两个方法,直接对应上拉和下拉做处理就好

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这个类中做一点修改,添加两个方法

//判别头部是否展示出来,如果展示出来代表下拉使得头部展示。true为下拉
	     public boolean isShownHeader() {
        return getHeaderLayout().isShown();
	    }
	    //判别低部是否展示出来,如果展示出来代表上拉使得低部展示。true为上拉
	    public boolean isShownFooter() {
	         return getFooterLayout().isShown();
	    }

然后用的时候,根据是否显示头和脚来判断

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);

转载于:https://my.oschina.net/fbf8866/blog/741572