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
下一篇: IndexError: invalid index of a 0-dim tensor. Use tensor.item() to convert a 0-dim tensor to a Python
推荐阅读
-
pulltorefresh上拉刷新下拉加载
-
PulltoRefresh下拉刷新,上拉加载
-
Pulltorefresh上拉加载下拉刷新
-
mui 上拉刷新下拉加载 pullToRefresh
-
3年以上勿进!最简单的Android自定义ListView下拉刷新与上拉加载,代码直接拿去用~
-
Android:下拉刷新+加载更多+滑动删除实例讲解
-
Android:下拉刷新+加载更多+滑动删除实例讲解
-
Android实现上拉加载更多ListView(PulmListView)
-
Android RecyclerView 上拉加载更多及下拉刷新功能的实现方法
-
ListView实现下拉刷新加载更多的实例代码(直接拿来用)