首页

Android开发中XRecyclerview用法及遇到的一些问题

Android开发XRecyclerview用法 2018-10-15 5718

目前通过xrecyclerview的开源代码来实现系列功能,加载数据传入type,值为1,2,3,分别表示初次加载,下拉刷新数据,上拉加载更多数据操作,刷新数据只需要重新放入数据,然后notifyDataSetChanged();即可.加载更多数据只需要在上拉时将获取数据放入之前数据list中刷新数据即可.这么说可能会比较抽象,下面让郑州app开发公司燚轩科技通过代码来具体给大家演示一下是如何实现的吧。

核心代码:

首先需要配置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开发公司燚轩科技刚才分享的源码来一步一步的去做,都是可以做到的,如果还是存在不理解的地方,可以咨询我们哦。

分享到微信朋友圈 +
打开微信,点击底部的“发现”,使用 “扫一扫” 即可将网页分享到我的朋友圈。 如何使用?
推荐文章

热贴More +

服务范围More +

联系我们

请扫二维码联系客服

854221200@qq.com

185-3825-9583

QQ客服

关于  ·  招聘  ·  案例中心  ·  网站地图

©@2018 燚轩科技版权所有 豫ICP备16015002号-4

百度提供搜索支持