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

RDK-X5极简部署YOLOv5:BPU适配三步法实战指南 YOLOv5作为轻量级目标检测的工业标准,在嵌入式端部署面临模型动态性、算子兼容性与硬件约束三重挑战。其核心原理在于将PyTorch动态图转化为BPU可执行的静态INT8计算图,关键技术价值体现在规避动态shape、禁用不支持op(如NonMaxSuppression)、强制NHWC内存布局等硬性限制。典型应用场景包括工地安全帽识别、边缘视频结构化与低功耗AI视觉终端。本文聚焦地平线RDK-X5平台,围绕YOLOv5模型转换与BPU加速推理两大热词,提供可复现的精简结构固化、ONNX定向导出、三段式编译映射 阅读详情

最近使用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() {
            @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:加载更多数据).由于是公司项目,这里我附上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中,然后刷新数据,数据请求和刷新是耗时的,所以开启子线程,部分代码如下:

@Override
        public 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() {
                        @Override
                        public void onItemClick(View view, int position) {

                            //相关操作
                        }

                        @Override
                        public 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() {
                    @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经过一些变换后所处的真正位置。
                 */
                    }
                });
  1. notifySetDataCahnged()无法刷新数据的问题:
    问题原因:先下拉刷新,然后上拉加载数据为空不显示,因为data的地址发生了变化,数据的刷新是在adapter中实现的,并且是新建一个list,然后调用了list.addAll(data),导致刷新data数据地址改变,刷新无效
    解决方案:新建一个list对象moreData来专门接收下拉刷新的数据,并且摒弃adapter中的addNewData()方法,直接data.clear()—data.addAll(moreData)—adapter.notifyDataChanged()

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

Android xRecyclerview 开源框架的使用 github地址 build.gradle 内添加 dependencies { implementation fileTree(dir: "libs", include: ["*.jar"]) implementation 'androidx.appcompat:appcompat:1.1.0' implementation 'androidx.constraintlayout:constraintlayout:1.1.3' testImplementation 'jun... 阅读详情

相关推荐

Proteus仿真实战:ADC0832时序解析与51单片机精准电压采集

本文详细解析了ADC0832模数转换芯片在Proteus仿真环境中的时序控制与51单片机驱动实现。通过实战代码示例和精度优化技巧,帮助开发者掌握电压采集的关键技术,包括时序配置、数据校验和噪声抑制等核心要点,提升嵌入式系统设计的精准度与可靠性。

weixin_29172963的博客 873

Android 之 XRecyclerview的使用

       前言:我们在上一篇文章中学到了Recyclerview但是在现实中往往需求不是那么的简单,可能需要多种需求合并起来,例如常见的上下拉刷新,删除 item 还有多种item,有着头部和尾部等等之类的。这次我们久来学习一个RecyclerView的库,XRecyclerView的他集合了众多的功能,下面就让我来讲解一下如何使用。   步骤: 引用 库 创建 控件 下拉刷新...

林一末的博客 1万+

Zemax:初学者的混合模式

光线以序列模式开始,然后接近非序列组件的入口端口。到达入口端口后,光线以非序列模式传播,然后接近出口端口。光线离开出口端口后,我们又回到序列模式。在此博客中,使用混合模式的示例将演示根据您自己的需要复制此工作流程所需的基本设置,以及一些有用的技巧。非序列组件表面类型必须在序列模式和非序列模式下定义。为了定义非序列组件的几何形状,请转到设置->编辑器->非序列,单击非序列编辑器。一旦我们进入非序列组件编辑器:表面 2 上的组件组,找到一个对象类型并进行定义。它能让您兼具序列模式的精确性和非序列模式的灵活性。

jkh920184196的博客 1340

推荐开源项目:XRecyclerView —— Android端强大的可扩展_recyclerView_

推荐开源项目:XRecyclerView —— Android端强大的可扩展_recyclerView_ 项目简介 是一个高度定制化的Android RecyclerView库,由开发者youxin11544精心打造。该项目旨在简化Android开发中对于列表视图的操作,提供丰富的功能和组件,以满足各种复杂的布局需求。 技术分析 XRecyclerView基于原生的android.support....

gitblog_00047的博客 624

Android14到Android16源码移植中的Bluetooth模块规范适配指南

本文详细解析了从Android14到Android16源码移植过程中Bluetooth模块的规范适配挑战,重点介绍了Android.bp配置差异及常见编译报错解决方案。针对代码规范检查、final字段声明、静态方法优化等核心问题提供实用修复方法,帮助开发者高效完成版本升级适配工作。

fire9的博客 254

(二)MS-MPI多机通信

1.关于MPI多机通信 一台计算机处理数据的能力是有限的,MPI的主要作用就是用来实现并行计算机,即将多台主机联机,实现大规模、高性能的计算机机群。我们知道一台计算机同时运行多个进程时,由于计算机资源是共享的,多个进程都会占用一些资源,每个进程运行的效率就会降低,比如当一台计算机同时跑着多个大型应用时会变得非常卡顿。所谓多机通信,可以理解为将本应该在同一台主机上运行的多个进程分配到多台主机上,以往...

xinwuya_的博客 4392

Android 中的 XRecyclerview的使用案例

我们在上一篇文章中学到了Recyclerview但是在现实中往往需求不是那么的简单,可能需要多种需求合并起来,例如常见的上下拉刷新,删除 item 还有多种item,有着头部和尾部等等之类的。这篇文章主要介绍了Android 中的 XRecyclerview的使用案例,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧。顺便讲一下一点更新数据的问题 ,使用下面语句来更新的时候我们必须更新我一初始化的数据内存,不能让引用指向另一内存。设置是否可以上下拉刷新(默认是可以的)

chinaherolts2008的博客 230

3D扩散模型的构建与优化:多模态融合在三维物体生成中的作用【附核心代码实例】

随着技术的发展,基于扩散模型的3D内容生成已经成为一个激动人心的领域。通过不断优化扩散模型的结构和算法,结合多模态信息、视角控制和高效网络架构,未来的3D生成技术将不仅能够生成逼真的物体,还能满足虚拟现实、游戏设计、电影制作等行业对高质量、实时生成的需求。

一键难忘的博客 2863

XRecyclerView的使用

一个RecyclerView,它实现了pullrefresh,loadmore和header featrues.you可以像标准的RecyclerView一样使用它。你不需要实现一个特殊的适配器.qq群478803619截图 用法 ##gradle compile 'com.jcodecraeer:xrecyclerview:1.3.2' 就像一个标准的

yancychas的博客 1万+

如何成为一名高级数字 IC 设计工程师(6-7)数字 IC 验证篇:DEBUG 技巧

不懂验证的设计不是好的设计;UVM 验证思维是指导缜密的芯片设计的导师;推荐书籍《芯片验证漫游指南》。

新芯设计的博客 1605

基于DNN神经网络的多输入多输出数据回归预测(附带Matlab代码)

假设我们的输入数据包含n个特征,输出数据包含m个特征。在本文中,我们将介绍如何使用DNN(深度神经网络)实现多输入多输出数据回归预测,并提供相应的Matlab代码。需要注意的是,上述代码中的DNN模型是一个简化的示例,您可以根据实际任务的复杂程度和要求进行相应的调整和优化。综上所述,我们介绍了如何使用DNN神经网络实现多输入多输出数据回归预测,并提供了相应的Matlab代码。函数对DNN模型进行训练,其中输入数据需要转置,以适应网络的输入要求。最后,我们使用训练好的模型对测试数据进行预测,并打印预测结果。

DevWizard的博客 1068

XRecyclerview和Recyclerview详解

XRecyclerview和Recyclerview相似,但是XRecyclerview自带下拉刷新和上拉加载更多的功能,除了引用不一样,其他的都一样,下面写详细代码: 两种可以使用到一个项目中 首先导入依赖 XRecyclerview的依赖: compile 'com.jcodecraeer:xrecyclerview:1.3.2' Recyclerview的依赖:

qq_40015237的博客 1186

Python电梯II

输入数据有若干组(最多不超过1000组),每组数据的第一行为四个如题目中所示的整数N,u,d,s,由空格分隔开。第二行为不同楼层需要上下楼的请求, 最多不超过1000个。每个请求的格式为"from-to",其中"from"和"to"为所在楼层和要到达的楼层,保证from!=to。

沐风—云端行者 910

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

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

燚轩软件科技 576

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

XRecyclerView 移除的踩坑之路(XRecyclerView 的bug?)

最近因为需要上下拉的刷新的功能,又不想重复造轮子,小编特意去找了个第三方的开源lib, 现在第三方上下拉刷新的开源lib是非常之多啊,我就不介绍了,反正小编情有独钟的看上了XRecyclerView , 至于为什么,其实是朋友推荐的。。。。。                  XRecyclerView 使用起来还是挺方便的,小编使用的过程,一路溜溜溜的,各种上下拉加载, 数据和布

famabb 5542

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

XRecyclerview嵌套XRecyclerview布局显示不全

前言  这篇文章是在笔者生病用手机写的,可能写的比较粗糙,希望读者能够海涵。大家在开发中经常会遇到recyclerview嵌套recyclerview的需求,或者把recyclerview作为头布局添加到recyclerview中,今天我们来说一下后者。正题  比如说头部是一个不固定条目数量的列表,具体展示多少条目根据服务器返回的数据来定,而外层也是一个列表。所以这个时候就用到我们所说的recyc...

xxm_love521的博客 882

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Xrecyclerview的使用

导入依赖包: compile 'com.jcodecraeer:xrecyclerview:1.3.2' XML: com.jcodecraeer.xrecyclerview.XRecyclerView android:id="@+id/xrclv" android:layout_width="match_parent" android:layout_he

gsc_19970804的博客 1911

XRecyclerView上下拉使用

XRecyclerView封装了上下拉的方法,非常的好用,这是它的使用Dome。

Dream_JK的博客 8204

XrecyclerView上拉下拉

依赖 implementation 'com.jcodecraeer:xrecyclerview:1.2.0' 布局 &amp;amp;lt;com.jcodecraeer.xrecyclerview.XRecyclerView android:id=&amp;quot;@+id/xrecy&amp;quot; android:layout_width=&amp;quot;match_parent&amp;quot;

WhuiQi的博客 442

XRecyclerview嵌套XRecyclerview布局显示不全问题

在开发过程中我们经常用到布局嵌套,此次记录XRecyclerview嵌套XRecyclerview布局显示不全问题,折磨我一个多小时。。。 按照惯例首先在网上的解决方案都撸了一把 如: 一:第一个adapter的inflate 第二个参数为null,第二个adapter的inflate 第二个参数为parent , 二:设置parent为(ViewGroup) this.findViewB...

qq_32044735的博客 531

阅读XRecyclerView源码一

熟悉并掌握 XRecyclerView 实现下拉刷新的过程

moduzhang的博客 825

mvp XRecyclerview

一个简单的demo,可以切换布局(流式布局与表格布局)

qq_39598738的博客 379

XRecyclerView的简单使用

请求数据用的是retrofit+Rxjava+MVP框架,这里就不具体写啦! 相信大家都会的哦!下面是XRecyclerView的具体使用: 详解如下: 首先是 MainActivity的布局 &lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;LinearLayout xmlns:android="http://schemas.andr...

xw_414的博客 1060
上一篇: android studio 复制项目运行出现Application Installation Failed问题
下一篇: android获取并显示camera拍摄或者本地图库的照片
水月沐风
博客等级 码龄10年 186粉丝 95原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值