使用 ReverseLayout recyclerview 将项目添加到 Endless Scroll RecyclerView

2023-12-22

在普通的回收器视图中,最新的项目都位于顶部,如果您将项目添加到回收器视图中,它会将现有项目向下推,新项目占据顶部位置。

在reverseLayout recyclerview中,最新的项目都位于底部,如果您将项目添加到recyclerview中,它将添加到底部。这种布局对于评论源之类的东西非常有用,您希望最新的评论位于底部。

一个很好的例子是 Facebook 评论源,例如当您评论朋友的状态时。可以看到,评论的发布时间都在最下方,从上到下时间从12小时递减到10小时:

verseLayout 很容易设置,我已经使用以下代码完成了它:

mLayoutManager = new LinearLayoutManager(this);
mLayoutManager.setReverseLayout(true);
mLayoutManager.setStackFromEnd(true);

然而,我正在努力附加一个反向无限滚动监听器。我不久前在我的问题中使用了以下 Vilen 的代码(将项目添加到 Endless Scroll RecyclerView 中,进度条位于底部 https://stackoverflow.com/questions/30681905/adding-items-to-endless-scroll-recyclerview-with-progressbar-at-bottom)并修改它,以便 onLoadMoreListener 仅在向上滚动而不是向下滚动时激活自身。您想向上滚动到较旧的评论:

    if (recyclerView.getLayoutManager() instanceof LinearLayoutManager) {
        final LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
        //if you add on addOnScrollListener, it will cause the scroll listener to be called twice each time you reset your adapter
        recyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
            int firstVisibleItem;
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);

                final int currentFirstVisibleItem = linearLayoutManager.findFirstVisibleItemPosition();
                totalItemCount = linearLayoutManager.getItemCount();
                lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition();

                if(lastVisibleItem > firstVisibleItem)
                {
                    Log.i("SCROLLING UP","TRUE");
                    if (!loading && totalItemCount <= (lastVisibleItem + visibleThreshold)) {
                        current_page++;
                        if (onLoadMoreListener != null) {
                            onLoadMoreListener.onLoadMore(current_page);
                        }
                        loading = true;
                    }
                }
                lastVisibleItem=firstVisibleItem;
            }
        });
    }

当调用onLoadMoreListener时,我的中调用了以下代码activity class:

    CommentsAdapter.OnLoadMoreListener onLoadMoreListener = new CommentsAdapter.OnLoadMoreListener() {
    @Override
    public void onLoadMore(int current_page) {
        //get the firstCommentId on the list of comments so that we can send it to the server to fetch comments less than that comment id to display in our recyclerview
        firstCommentId = comments.get(0).getId();
        //add empty item for progress bar / wheel and display the progress bar / wheel
        Comment comment = new Comment();
        comment.setViewType(Constants.COMMENT_PROGRESS_BAR);
        comments.add(0, comment);
        mCommentAdapter.notifyItemInserted(0);
        mCommentAdapter.notifyItemRangeChanged(1, comments.size());

        //CODE FOR NETWORK OPERATIONS GOES HERE TO FETCH THE NEXT FEW COMMENTS WHEN SCROLLING UP//
    }
};

但是,当我向上滚动时, onLoadMoreListener 似乎根本没有被调用。

我还确保我的提要中至少有 10 条评论,并且之前已加载 5 条评论,当我向上滚动时,还应该加载 5 条评论。

有谁知道我这个反向 OnLoadMoreListener 做错了什么?

EDIT:

verseLayout recyclerview 实际上可以与 Vilen 的原始代码一起使用,我已经上传了一个 github 存储库来展示这一点:

https://github.com/Winghin2517/ReverseLayoutRecyclerview https://github.com/Winghin2517/ReverseLayoutRecyclerview

不过,激活 onLoadMoreListener 时仍然存在问题 - 如果评论列表仅包含 3 条评论,并且没有更多评论可添加,那么我根本不希望 onLoadMoreListener 激活最初查看我的评论 - 当我first点击我的应用程序即可查看评论。现在,当我点击查看我的评论时,即使数据集中有 3 条评论,进度条仍然显示,并在 2 秒后消失,我认为这是没有必要的(请参阅 github 存储库,我在其中演示了这一点)。

当只有 3 条评论时禁用它也不是一个好主意,因为 onLoadMoreListener 的作用类似于 swipeToRefresh 对象。如果用户在查看评论源后有更多评论,他可以向下滑动,onLoadMoreListener 将显示这些评论。

有没有办法在 feed 加载时禁用它最初?


Simon:我之前提出的解决方案here https://stackoverflow.com/a/30691092/855843无需任何修改即可与反向布局配合使用。我为反向布局添加的唯一内容是当您第一次显示它时自动滚动到第一个项目,但这取决于您。 现在回到你遇到的问题。您提到当您滚动时什么也不会发生。所以我的猜测是您以错误的顺序初始化了回收器视图。确保你这样做

mLayoutManager = new LinearLayoutManager(this);
mLayoutManager.setReverseLayout(true);
mLayoutManager.setStackFromEnd(true);

mRecyclerView.setLayoutManager(mLayoutManager);
mAdapter = new MyAdapter<>(myDataset, mRecyclerView);
mRecyclerView.setAdapter(mAdapter);

Note该布局管理器首先被实例化,然后设置它,然后提供适配器。让我知道情况是否如此。

Edit只是从下面的评论中提出这一点:

忘记我们所拥有的onLoadMoreListener所有滚动的东西都只使用标准RecyclerView包装成SwipeToRefreshLayout

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 ReverseLayout recyclerview 将项目添加到 Endless Scroll RecyclerView 的相关文章

随机推荐

  • 自定义 UIBarButtonItem 的活动区域更小

    我有一个带有自定义 UIBarButtonItem 的 UINavigationBar 它使用 UIButton 作为其自定义视图 问题是 自定义按钮的活动区域太大 如果我点击按钮外至少 40 像素 它仍然会被注册为点击按钮 这会导致意外点
  • 在 Cython 中生成随机数的规范方法

    生成伪均匀随机数 0 1 中的双精度数 的最佳方法是什么 跨平台 最好具有相同的相同样本序列 线程安全 显式传递 prng 或 内部使用线程本地状态 不带 GIL 锁 可轻松包装在 Cython 中 曾经有一个类似的post https s
  • Webpack 是否足够智能,可以让 jQuery 变得更轻?

    我知道这是一个非常简单的问题 但我还没有看到任何像这样简单的问题 答案 我正在尝试确定 jQuery 是否值得保留在我的 React 应用程序中 并且我几乎完全将它用于 ajax webpack 是否足够智能 可以仅在捆绑包中包含 jQue
  • JVM 属性 -Dfile.encoding=UTF8 还是 UTF-8?

    我想知道将文件编码设置为 UTF 8 的 Java 虚拟机 JVM 属性的值是多少 我放吗 Dfile encoding UTF8 or Dfile encoding UTF 8 这将是 UTF8 See here http downloa
  • 处理 winform 文本框上的箭头键事件而不覆盖

    我遇到一种情况 我获得了一个 WinForms TextBox 实例 我想将自动完成功能附加到该实例 我已经解决了自动完成 字符串匹配 下拉 的问题 并且到目前为止它工作可靠 使用键盘导航下拉菜单的能力是什么 这是此类 UI 的标准 自然的
  • 多租户应用程序中的 MyBatis Spring

    您好 在多租户中使用 MyBatis spring 时需要一些帮助 应用 是否可以 特别是因为我不知道如何 可以使用 sqlSessionFactory 配置 MapperScannerConfigurer 运行 这是另一种使用插件 也称为
  • “依赖项”不能应用于“(groovy.lang.Closure)”

    我无法修复此错误 dependencies cannot be applied to groovy lang Closure 这是我的 gradle 文件 buildscript repositories maven url http do
  • 出现异常时继续执行

    下面是我要执行的脚本 这里的问题是一旦发生异常它就会停止执行 我用过continue在 catch 块中 但这不起作用 即使发生异常后 我如何让它工作 它应该循环foreach 我也用过一个while true 循环 但进入了无限循环 该怎
  • 注解反射(使用 getAnnotation)不起作用

    我必须按照代码来检查我的实体是否model has a nullable false或字段上的类似注释 import javax persistence Column import private boolean isRequired It
  • jhipster - gyp 动词 `which` 失败错误:未找到:python2

    以下是当我尝试使用 JHipster 生成新项目时出现的错误 gyp verb check python checking for Python executable python2 in the PATH gyp verb which f
  • 是否强制要求短路逻辑运算符?以及评估顺序?

    有ANSI标准吗mandate在 C 或 C 中要短路的逻辑运算符 我很困惑 因为我记得 K R 书中说你的代码不应该依赖于这些被短路的操作 因为它们可能不会 有人可以指出标准中哪里说逻辑操作总是短路的吗 我对 C 最感兴趣 对于 C 的答
  • 使用动态 form_class 更新视图

    我想动态改变form class of an UpdateViewDjango 1 6 中的 CBV 我尝试使用 get context data 来执行此操作 但这没有帮助 因为表单已经初始化 所以这需要在 init 我猜 这是我尝试过的
  • R中的zoo对象和ts对象有什么区别?

    我想知道使用上的差异ts or zoo 功能 动物园对象的索引属性中的时间值 可能不规则 在控制台上显示为行名称print zoo方法以及矩阵或原子向量中的值 这些值对可以使用的值进行了限制 通常是数字 但必须全部是单一模式 即不是像数据帧
  • 我应该在程序结束时删除 C++ 中的大树集合还是将其留给操作系统? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 这可能是个有点愚蠢的问题 我应该打电话吗delete在节目结束时的巨大地图 场景上 假设整个程序都需要地图 集合 delete是返回前的最后一行
  • tumblr 和 google+ 如何像拼图一样堆叠图像?

    我想要制作一个图像库 并且想知道如何像 Google 和 tumblr 那样堆叠图像 我的意思是 当你查看 tumblr 的存档页面时 它们都堆积在列中 http the overlook hotel tumblr com archive
  • Azure 网站支持的最大域数

    我们正在构建一个托管服务 每个用户在注册时都会在我们的服务域上获得一个自定义子域 例如john myservice com 我们通过在 Azure 网站的域管理器中添加通配符条目来处理此问题 myservice com Azure 网站现在
  • Heroku 上的回形针?

    我很好奇是否有人可以在不使用 S3 的情况下在 Heroku 上工作 我假设 Heroku 是一个只读系统 但必须有某种方法可以在那里保存图像 您无法写入 Heroku 的文件系统 因此无法按照您想要的方式保存图像 您的选择是使用 S3 等
  • django-rest-auth 重置密码 uid 和令牌

    我们的团队在后端使用 django rest api 进行项目 并在前端进行响应 对于身份验证 我们使用 django rest auth 并且我们在密码重置方面遇到问题 这里的网址 urlpatterns url r accounts i
  • 如何在 AngularJS 中异步加载谷歌地图?

    现在我已经找到了一种在以下方法的帮助下初始化 Google 地图的方法安迪 乔斯林 https stackoverflow com users 1397051 andy joslin在这个SO在 angularjs 中初始化 google
  • 使用 ReverseLayout recyclerview 将项目添加到 Endless Scroll RecyclerView

    在普通的回收器视图中 最新的项目都位于顶部 如果您将项目添加到回收器视图中 它会将现有项目向下推 新项目占据顶部位置 在reverseLayout recyclerview中 最新的项目都位于底部 如果您将项目添加到recyclerview