XRecyclerview用法以及遇到的一些问题

2023-10-23 14:38

本文主要是介绍XRecyclerview用法以及遇到的一些问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近使用XRecyclerview来实现数据的刷新和上拉加载更多操作,由于第一次使用,踩了不少坑,本文即为记录问题.

概述

XRecyclerview的基本用法就不多说了,github上面介绍的比较清楚,也可以查看作者提供的example来方便了解用法,github地址:XRecyclerview
本文要说明的主要是使用XRecyclerview实现后台数据的下拉刷新以及上拉加载更多的实战,作者提供的demo里面是静态放置的数据,相对于简单,真正对接后台数据时可能会有很多未知问题,本文主要扒扒自己项目中遇到的坑和数据刷新加载的具体实现方式.

用法思路

实现思路:目前通过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() {@Overridepublic void onRefresh() {new Handler().postDelayed(new Runnable(){public void run() {getWorksData(1,2);}}, 2000);}@Overridepublic 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:加载更多数据).由于是公司项目,这里我附上okhttp请求的onResponse()方法得到数据后的处理:

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<CreativeImageBean.CreativeImageList.CreativeImageData>();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<CreativeImageBean.CreativeImageList.CreativeImageData>();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();}}} 

第一次使用markdown写博客,怎么感觉代码很乱…
如果感觉if-else比较乱,可以使用switch-case,数据刷新即需要重新获取后台最新数据,比如用户上传了自己的作品,那么就需要在他将作品上传成功后刷新数据,让用看到自己的作品,而加载更多则是根据用户上拉的操作,判断需要请求的数据页数,并将数据放入原有的data中,然后刷新数据,数据请求和刷新是耗时的,所以开启子线程,部分代码如下:

@Overridepublic void handleMessage(Message msg, Activity weakReferenceActivity) {switch (msg.what) {case GET_DATA://显示数据和处理loge("来获取数据和显示了");xRecyclerView.setLayoutManager(new GridLayoutManager(MemoryWorksActivity.this,2));workAdapter = new WorksShowAdapter(MemoryWorksActivity.this,data);loge("data初始的地址==="+data.hashCode());xRecyclerView.setAdapter(workAdapter);workAdapter.setOnMyItemClickListener(new CreativeImageAdapter.OnMyItemClickListener() {@Overridepublic void onItemClick(View view, int position) {//相关操作}@Overridepublic void onItemLongClick(View view, int position) {}});break;case UPDATE_DATA://刷新数据loge("来刷新数据了,这时data数量为"+data.size());//workAdapter.addNewData(data);data.clear();data.addAll(updateData);workAdapter.notifyDataSetChanged();break;}}
    刷新数据需要先清除原有数据,然后放入最新数据,接着调用adaper.motifyDataSetChange()方法.
问题总览
  1. 点击第i个item,提示却是第i+1个item被点击
    问题原因:xrecyclerrview默认添加的header和footer,这就导致item的真实位置发生了变化,
    解决方案:将item的位置由holder.getLayoutPosition()改为position就可以了,adapter中修改代码如下:
holder.itemView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//int pos = holder.getLayoutPosition();//点击的item控件的位置myListener.onItemClick(holder.itemView, position);/*此方法返回的pos值与onBindViewHolder方法传入的position值有可能不同。根据SDK中的解释,在Recyclerview 进行添加、移除item等操作时,position位置可能会变化,而所有的adapter的刷新并不总是及时的,只有这个方法返回的才是当前item经过一些变换后所处的真正位置。*/}});
  1. notifySetDataCahnged()无法刷新数据的问题:
    问题原因:先下拉刷新,然后上拉加载数据为空不显示,因为data的地址发生了变化,数据的刷新是在adapter中实现的,并且是新建一个list,然后调用了list.addAll(data),导致刷新data数据地址改变,刷新无效
    解决方案:新建一个list对象moreData来专门接收下拉刷新的数据,并且摒弃adapter中的addNewData()方法,直接data.clear()—data.addAll(moreData)—adapter.notifyDataChanged()

补充:本文仅做记录和供大家参考,如有需改进和错误之处,欢迎大家留言提出,谢谢!

这篇关于XRecyclerview用法以及遇到的一些问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/268493

相关文章

JDK21对虚拟线程的几种用法实践指南

《JDK21对虚拟线程的几种用法实践指南》虚拟线程是Java中的一种轻量级线程,由JVM管理,特别适合于I/O密集型任务,:本文主要介绍JDK21对虚拟线程的几种用法,文中通过代码介绍的非常详细,... 目录一、参考官方文档二、什么是虚拟线程三、几种用法1、Thread.ofVirtual().start(

IDEA和GIT关于文件中LF和CRLF问题及解决

《IDEA和GIT关于文件中LF和CRLF问题及解决》文章总结:因IDEA默认使用CRLF换行符导致Shell脚本在Linux运行报错,需在编辑器和Git中统一为LF,通过调整Git的core.aut... 目录问题描述问题思考解决过程总结问题描述项目软件安装shell脚本上git仓库管理,但拉取后,上l

idea npm install很慢问题及解决(nodejs)

《ideanpminstall很慢问题及解决(nodejs)》npm安装速度慢可通过配置国内镜像源(如淘宝)、清理缓存及切换工具解决,建议设置全局镜像(npmconfigsetregistryht... 目录idea npm install很慢(nodejs)配置国内镜像源清理缓存总结idea npm in

pycharm跑python项目易出错的问题总结

《pycharm跑python项目易出错的问题总结》:本文主要介绍pycharm跑python项目易出错问题的相关资料,当你在PyCharm中运行Python程序时遇到报错,可以按照以下步骤进行排... 1. 一定不要在pycharm终端里面创建环境安装别人的项目子模块等,有可能出现的问题就是你不报错都安装

idea突然报错Malformed \uxxxx encoding问题及解决

《idea突然报错Malformeduxxxxencoding问题及解决》Maven项目在切换Git分支时报错,提示project元素为描述符根元素,解决方法:删除Maven仓库中的resolv... 目www.chinasem.cn录问题解决方式总结问题idea 上的 maven China编程项目突然报错,是

Java8 Collectors.toMap() 的两种用法

《Java8Collectors.toMap()的两种用法》Collectors.toMap():JDK8中提供,用于将Stream流转换为Map,本文给大家介绍Java8Collector... 目录一、简单介绍用法1:根据某一属性,对对象的实例或属性做映射用法2:根据某一属性,对对象集合进行去重二、Du

Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题

《Python爬虫HTTPS使用requests,httpx,aiohttp实战中的证书异步等问题》在爬虫工程里,“HTTPS”是绕不开的话题,HTTPS为传输加密提供保护,同时也给爬虫带来证书校验、... 目录一、核心问题与优先级检查(先问三件事)二、基础示例:requests 与证书处理三、高并发选型:

Python中isinstance()函数原理解释及详细用法示例

《Python中isinstance()函数原理解释及详细用法示例》isinstance()是Python内置的一个非常有用的函数,用于检查一个对象是否属于指定的类型或类型元组中的某一个类型,它是Py... 目录python中isinstance()函数原理解释及详细用法指南一、isinstance()函数

Python中的sort方法、sorted函数与lambda表达式及用法详解

《Python中的sort方法、sorted函数与lambda表达式及用法详解》文章对比了Python中list.sort()与sorted()函数的区别,指出sort()原地排序返回None,sor... 目录1. sort()方法1.1 sort()方法1.2 基本语法和参数A. reverse参数B.

vue监听属性watch的用法及使用场景详解

《vue监听属性watch的用法及使用场景详解》watch是vue中常用的监听器,它主要用于侦听数据的变化,在数据发生变化的时候执行一些操作,:本文主要介绍vue监听属性watch的用法及使用场景... 目录1. 监听属性 watch2. 常规用法3. 监听对象和route变化4. 使用场景附Watch 的