目前通过xrecyclerview的开源代码来实现系列功能,加载数据传入type,值为1,2,3,分别表示初次加载,下拉刷新数据,上拉加载更多数据操作,刷新数据只需要重新放入数据,然后notifyDataSetChanged();即可.加载更多数据只需要在上拉时将获取数据放入之前数据list中刷新数据即可.这么说可能会比较抽象,下面通过代码来具体给大家演示一下是如何实现的吧。
核心代码:
首先需要配置xRecyclerview的属性:
xRecyclerView.setPullRefreshEnabled(true);
xRecyclerView.setLoadingMoreEnabled(true);
xRecyclerView.setRefreshProgressStyle(ProgressStyle.BallSpinFadeLoader);
xRecyclerView.setLoadingMoreProgressStyle(ProgressStyle.Pacman);
xRecyclerView.setLoadingListener(new XRecyclerView.LoadingListener() {
@Override
public void onRefresh() {
new Handler().postDelayed(new Runnable(){
public void run() {
getWorksData(1,2);
}
}, 2000);
}
@Override
public void onLoadMore() {
count+=1;
loge("第几次加载=="+count);
new Handler().postDelayed(new Runnable(){
public void run() {
getWorksData(count,3);
}
}, 2000);
}
});
从上面代码可以看到,需要先设置下拉刷新和加载更多可执行,为true,然后设置它的加载样式,有多种样式可以选择,具体参考xrecyclerview的github介绍,接下里设置一下loadingListener即可.我们需要实现它的两个方法:刷新回调方法onRefresh()和加载更多方法onLoadingMore(),即分别在这两个方法中实现自己的刷新和加载数据逻辑即可.
getWorksData(参数1,参数2)即为获取后天数据的方法.参数1是指数据请求的次数,也指代请求后台的数据页数,初始化为1;参数2表示当前数据的操作模式(为1:初次请求数据,为2:刷新数据,为3:加载更多数据).
loadingDialog.dismiss();
creativeImageBean = JSONObject.parseObject(response, CreativeImageBean.class);
if (creativeImageBean!=null && creativeImageBean.getCode() == 1000) {
if(type==1){
//是初次加载
loge("初次加载数据");
data=creativeImageBean.getData().getList();
Message msg = Message.obtain(handler);
msg.what = GET_DATA;
handler.handleMessage(msg);
}else if(type==2){
//下拉刷新
//data = new ArrayList();
updateData=creativeImageBean.getData().getList();
count = 1;
loge("刷新了");
xRecyclerView.refreshComplete();
if (workAdapter != null) {
Message msg = Message.obtain(handler);
msg.what = UPDATE_DATA;
handler.sendMessage(msg);
} else {
Message msg = Message.obtain(handler);
msg.what = GET_DATA;
handler.sendMessage(msg);
}
}else if(type==3){
//加载更多
//moreData = new ArrayList();
moreData = creativeImageBean.getData().getList();
loge("加载更多数据页数==" + count+"---数据量--"+moreData.size());
if (moreData != null && moreData.size() > 0) {
data.addAll(moreData);
loge("data加载更多数据后的地址=="+data.hashCode());
loge("作品总数据长度==" + data.size());
// Message msg = Message.obtain(handler);
// msg.what = UPDATE_DATA;
// handler.sendMessage(msg);
if(workAdapter!=null){
loge("workAdapter不为空");
workAdapter.notifyDataSetChanged();
}else {
loge("workAdapter为空");
workAdapter = new WorksShowAdapter(MemoryWorksActivity.this,data);
xRecyclerView.setAdapter(workAdapter);
}
xRecyclerView.loadMoreComplete();
//workAdapter.addNewData(data);//添加数据
//如果添加moreData,为空是什么原因
} else {
loge("moreData数据为空");
// xRecyclerView.setLoadingMoreEnabled(false);
// toast(getString(R.string.act_home_loadmore));
xRecyclerView.loadMoreComplete();
}
}
}
刷新数据需要先清除原有数据,然后放入最新数据,接着调用adaper.motifyDataSetChange()方法.
问题总览
点击第i个item,提示却是第i+1个item被点击
问题原因:xrecyclerrview默认添加的header和footer,这就导致item的真实位置发生了变化,
解决方案:将item的位置由holder.getLayoutPosition()改为position就可以了,adapter中修改代码如下:
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//int pos = holder.getLayoutPosition();//点击的item控件的位置
myListener.onItemClick(holder.itemView, position);
/*
此方法返回的pos值与onBindViewHolder方法传入的position值有可能不同。
根据SDK中的解释,在Recyclerview 进行添加、移除item等操作时,position位置可能会变化,
而所有的adapter的刷新并不总是及时的,
只有这个方法返回的才是当前item经过一些变换后所处的真正位置。
*/
}
});
notifySetDataCahnged()无法刷新数据的问题:
问题原因:先下拉刷新,然后上拉加载数据为空不显示,因为data的地址发生了变化,数据的刷新是在adapter中实现的,并且是新建一个list,然后调用了list.addAll(data),导致刷新data数据地址改变,刷新无效
解决方案:新建一个list对象moreData来专门接收下拉刷新的数据,并且摒弃adapter中的addNewData()方法,直接data.clear()—data.addAll(moreData)—adapter.notifyDataChanged()
虽然内容有些多,但是只要大家按照刚才分享的源码来一步一步的去做,都是可以做到的,如果还是存在不理解的地方,可以咨询我们哦。
本文由专业的郑州app开发公司燚轩科技整理发布,原创不易,如需转载请注明原文作者及出处。
原文地址:http://blog.51cto.com/13686158/2308473