PulltoRefresh下拉刷新,上拉加载

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

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

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

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

   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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值