BaseRecyclerViewAdapterHelper的使用姿势问题

2023-12-24 07:08

本文主要是介绍BaseRecyclerViewAdapterHelper的使用姿势问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.此控件再第一次进入界面时会自动回调上拉加载的接口,并显示底部

disableLoadMoreIfNotFullPage
可以使用上面的方法,但直接使用会有问题,根据 issues,总结出如下使用方法

首先再oncreate 禁止掉上拉刷新,方法如下

mAdapter.setEnableLoadMore(false);
然后在请求成功以后,代码如下

@Override
public void onSuccess(String result) {if (!mAdapter.isLoadMoreEnable()) {mAdapter.setEnableLoadMore(true);
    }Logger.d("CollectActivity", result);
    HashMap map = gson().fromJson(result, HashMap.class);
    if (isRefresh == true) {//刷新
        mRefresh.setRefreshing(false);
        List<PoiMerge02> list = gson().fromJson(gson().toJson(map.get("rows")), new TypeToken<ArrayList<PoiMerge02>>() {}.getType());
        mList.clear();
        mList.addAll(list);
        mAdapter.loadMoreComplete();
    } else {List<PoiMerge02> list = gson().fromJson(gson().toJson(map.get("rows")), new TypeToken<ArrayList<PoiMerge02>>() {}.getType());
        if (list.size() != 0) {mList.addAll(list);
            mAdapter.setNewData(mList);
        } else {mAdapter.loadMoreEnd(false);
            return;
        }}mAdapter.disableLoadMoreIfNotFullPage();
    Logger.d("ToiletAllCommentActivity", result);
    L.e(result);

}

经测试,上面的方法没有问题,我开始使用

mAdapter.notifyDataSetChanged();

方法去更新数据,但在后面不调用loadMoreComplete方法,会有意想不到的错误,所以还是使用了BaseRecyclerViewAdapterHelper的更新数据方法。

如果使用

mAdapter.notifyDataSetChanged();

请在后面使用loadmorecomplete方法。


当在oncreate里不小心直接使用了BaseRecyclerViewAdapterHelper的 disableLoadMoreIfNotFullPage方法去禁止自动加载后,当数据没有铺满屏幕的时候时没有问题的,但是当第一次请求的数据铺满屏幕的时候,我测试了一下发现上拉加载就不起作用啦,但是如果不调用如上方法,又禁止不了上拉加载。所以还是使用了我上面的方法去请求。



另外还有一个问题,当在

mAdapter.loadMoreEnd(false);
后面调用
mAdapter.disableLoadMoreIfNotFullPage();

会有bug,所以我加了个return,让他不调用这个方法。


另一种方式,上面的代码有重复,因为在onSuccess里重新setEnableLoadMore(true) ,所以就是在oncreate中不调用setEnableLoadMore方法,只在请求完数据后调用

   mAdapter.disableLoadMoreIfNotFullPage();

完整代码如下

@Override
public void onSuccess(String result) {Logger.d("CollectActivity", result);
    HashMap map = gson().fromJson(result, HashMap.class);
    if (isRefresh == true) {//刷新
        mRefresh.setRefreshing(false);
        List<PoiMerge02> list = gson().fromJson(gson().toJson(map.get("rows")), new TypeToken<ArrayList<PoiMerge02>>() {}.getType());
        mList.clear();
        mList.addAll(list);
        mAdapter.loadMoreComplete();
    } else {//加载
        List<PoiMerge02> list = gson().fromJson(gson().toJson(map.get("rows")), new TypeToken<ArrayList<PoiMerge02>>() {}.getType());
        if (list.size() != 0) {mList.addAll(list);
            mAdapter.setNewData(mList);
        } else {mAdapter.loadMoreEnd(false);
            return;
        }}mAdapter.disableLoadMoreIfNotFullPage();
    Logger.d("CollectActivity", result);
}

上面的两种方法的代码使用还是有问题的,比如上面代码在上拉加载获得的数据里使用了

mAdapter.setNewData(mList);

来更新数据,可能回出现列表频闪的问题,如果直接使用loadmorecomplete方法,不使用notifydatasetchange的话虽然也能更新数据,但是会出现整个列表下移回弹一个item的问题,而不是直接在后面附加数据,综上所述 上面的两种方式的使用姿势还是不对。正确的姿势如下


oncreate里不用setEnableLoadMore(false),调用了的话使用下面方法还是回自动加载,具体原因 母鸡@Override
public void onSuccess(String result) {Logger.d("CollectActivity", result);
    HashMap map = gson().fromJson(result, HashMap.class);
    if (isRefresh == true) {//刷新
        mRefresh.setRefreshing(false);
        List<PoiMerge02> list = gson().fromJson(gson().toJson(map.get("rows")), new TypeToken<ArrayList<PoiMerge02>>() {}.getType());
        mList.clear();
        mList.addAll(list);
        mAdapter.loadMoreComplete();
    } else {List<PoiMerge02> list = gson().fromJson(gson().toJson(map.get("rows")), new TypeToken<ArrayList<PoiMerge02>>() {}.getType());
        if (list.size() != 0) {mList.addAll(list);
            mAdapter.notifyDataSetChanged();
            mAdapter.loadMoreComplete();
        } else {mAdapter.loadMoreEnd(false);
            return;
        }}mAdapter.disableLoadMoreIfNotFullPage();
    Logger.d("ToiletAllCommentActivity", result);
    L.e(result);

}

一定要注意loadxxxx方法的使用,否则会出现意想不到的问题,以上只是本人测试和在使用中遇到的问题,具体请看框架的github和官网介绍


另外结合SmartRefreshLayout 和阿里的vlayout效果更佳,当时vlayout可能会有悬浮item,SmartRefreshLayout似乎根据viewgroup.getChild(0)去判断是否刷新的,vlayout不建议这样去判断,所以结合使用可能会有坑。










这篇关于BaseRecyclerViewAdapterHelper的使用姿势问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Qt之QMessageBox的具体使用

《Qt之QMessageBox的具体使用》本文介绍Qt中QMessageBox类的使用,用于弹出提示、警告、错误等模态对话框,具有一定的参考价值,感兴趣的可以了解一下... 目录1.引言2.简单介绍3.常见函数4.按钮类型(QMessage::StandardButton)5.分步骤实现弹窗6.总结1.引言

Python使用Reflex构建现代Web应用的完全指南

《Python使用Reflex构建现代Web应用的完全指南》这篇文章为大家深入介绍了Reflex框架的设计理念,技术特性,项目结构,核心API,实际开发流程以及与其他框架的对比和部署建议,感兴趣的小伙... 目录什么是 ReFlex?为什么选择 Reflex?安装与环境配置构建你的第一个应用核心概念解析组件

Qt中Qfile类的使用

《Qt中Qfile类的使用》很多应用程序都具备操作文件的能力,包括对文件进行写入和读取,创建和删除文件,本文主要介绍了Qt中Qfile类的使用,具有一定的参考价值,感兴趣的可以了解一下... 目录1.引言2.QFile文件操作3.演示示例3.1实验一3.2实验二【演示 QFile 读写二进制文件的过程】4.

spring security 超详细使用教程及如何接入springboot、前后端分离

《springsecurity超详细使用教程及如何接入springboot、前后端分离》SpringSecurity是一个强大且可扩展的框架,用于保护Java应用程序,尤其是基于Spring的应用... 目录1、准备工作1.1 引入依赖1.2 用户认证的配置1.3 基本的配置1.4 常用配置2、加密1. 密

WinForms中主要控件的详细使用教程

《WinForms中主要控件的详细使用教程》WinForms(WindowsForms)是Microsoft提供的用于构建Windows桌面应用程序的框架,它提供了丰富的控件集合,可以满足各种UI设计... 目录一、基础控件1. Button (按钮)2. Label (标签)3. TextBox (文本框

解决Java异常报错:java.nio.channels.UnresolvedAddressException问题

《解决Java异常报错:java.nio.channels.UnresolvedAddressException问题》:本文主要介绍解决Java异常报错:java.nio.channels.Unr... 目录异常含义可能出现的场景1. 错误的 IP 地址格式2. DNS 解析失败3. 未初始化的地址对象解决

使用Vue-ECharts实现数据可视化图表功能

《使用Vue-ECharts实现数据可视化图表功能》在前端开发中,经常会遇到需要展示数据可视化的需求,比如柱状图、折线图、饼图等,这类需求不仅要求我们准确地将数据呈现出来,还需要兼顾美观与交互体验,所... 目录前言为什么选择 vue-ECharts?1. 基于 ECharts,功能强大2. 更符合 Vue

如何合理使用Spring的事务方式

《如何合理使用Spring的事务方式》:本文主要介绍如何合理使用Spring的事务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、底层构造1.1.事务管理器1.2.事务定义信息1.3.事务状态1.4.联系1.2、特点1.3、原理2. Sprin

Vue中插槽slot的使用示例详解

《Vue中插槽slot的使用示例详解》:本文主要介绍Vue中插槽slot的使用示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、插槽是什么二、插槽分类2.1 匿名插槽2.2 具名插槽2.3 作用域插槽三、插槽的基本使用3.1 匿名插槽

springboot+vue项目怎么解决跨域问题详解

《springboot+vue项目怎么解决跨域问题详解》:本文主要介绍springboot+vue项目怎么解决跨域问题的相关资料,包括前端代理、后端全局配置CORS、注解配置和Nginx反向代理,... 目录1. 前端代理(开发环境推荐)2. 后端全局配置 CORS(生产环境推荐)3. 后端注解配置(按接口