Android 房间分页不起作用

2024-01-04

我正在尝试使用 android Room API 从页面中的 sqlite 加载记录。

问题是分页库正在将整个数据库加载到模型类中并将其与适配器绑定,这使得 UI 线程跳帧。它假设加载 20 条记录,然后在需要时继续添加更多记录

这是我的视图模型类

public class UserViewModel extends ViewModel {

    public LiveData<PagedList<User>> userList;

    public UserViewModel() {

    }

    public void init(UserDao userDao) {
        PagedList.Config pagedListConfig =
                (new PagedList.Config.Builder()).setEnablePlaceholders(true)
                        .setPrefetchDistance(10)
                        .setPageSize(20).build();

        userList = (new LivePagedListBuilder(userDao.usersByFirstName(),
                pagedListConfig))
                .build();

    }
}

分页适配器

public class UserAdapter extends PagedListAdapter<User, UserAdapter.UserItemViewHolder> {


    protected UserAdapter() {
        super(User.DIFF_CALLBACK);
    }

    @Override
    public UserItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
        View view = layoutInflater.inflate(R.layout.item_user_list, parent, false);
        return new UserItemViewHolder(view);
    }

    @Override
    public void onBindViewHolder(UserItemViewHolder holder, int position) {
        User user= getItem(position);
        if(user!=null) {
            holder.bindTo(user);
        }
    }

    static class UserItemViewHolder extends RecyclerView.ViewHolder {
        TextView userName, userId;

        public UserItemViewHolder(View itemView) {
            super(itemView);
            userId = itemView.findViewById(R.id.userId);
            userName = itemView.findViewById(R.id.userName);
        }

        public void bindTo(User user) {
            userName.setText(user.firstName);
            userId.setText(String.valueOf(user.userId));
        }
    }
}

与recycler视图绑定:

  UserViewModel viewModel =
                ViewModelProviders
                        .of(this)
                        .get(UserViewModel.class);
        viewModel.init(userDao);
        final UserAdapter userUserAdapter = new UserAdapter();

        viewModel.userList.observe(this, pagedList -> {
            Toast.makeText(this, "Page " + pagedList.size(), Toast.LENGTH_SHORT).show();
            Log.e("Paging ", "Page " + pagedList.size());
            userUserAdapter.setList(pagedList);
        });

        recyclerView.setAdapter(userUserAdapter);

02-18 10:19:40.409 15310-15310/com.androidkt.archpaging E/分页:页面 200

知道我缺少什么吗?


通过分页实现,您的结果计数确实应该是查询的完整大小 (200),正如您配置的那样,RecyclerView将收到占位符null对于数据尚未准备好的视图。这是为了当您想要显示整个列表视图但仅在数据可用时绑定它的内容时。但你的RecyclerView不应该打电话onCreateViewHolder and onBindViewHolder整个计数,除非它是可见的。

检查(放置断点)方法onMeasure or onLayout在你的RecyclerView看看该方法是否没有返回比预期更大的高度(可能预期是屏幕大小的高度)。有时实际高度RecyclerView比屏幕和适配器调用大得多onBindViewHolder()项目总数,因为它是“可见”的,而不是我们可以看到的数量。这将触发DataSource在需要之前查询数据库并绑定视图。

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

Android 房间分页不起作用 的相关文章

随机推荐

  • 如何使用Python将霍夫曼编码写入文件?

    我创建了一个 Python 脚本来使用霍夫曼算法压缩文本 假设我有以下字符串 string The quick brown fox jumps over the lazy dog 运行我的算法会返回以下 位 result 011111001
  • 四边形上的输出纹理不正确

    我正在尝试使用 freetype 在我的应用程序中显示文本 起初我认为这个内置函数 这对于用于绘制文本的库来说是很自然的 但只有一个显示符号的功能 然后我决定将这些字符一一放入纹理中 但我再次感到失望 所有指南一个纹理都使用单个图像 可能
  • React Native:无法构造变压器:错误:无法创建长度超过 0x1fffffe8 个字符的字符串

    包 json name project version 0 0 1 private true scripts android react native run android ios react native run ios start r
  • char*/字符串连接而不复制?

    我想在 C 或 C 中连接 2 个字符串 而不需要新的内存分配和复制 是否可以 可能的C代码 char str1 char malloc 100 char str2 char malloc 50 char str3 some code th
  • 如何使用PHP连接到as400

    我正在尝试使用以下代码将我的 AS400 与 V5R3 和 PHP 连接
  • 如何将打开的窗体定位在 C# Windows 窗体中的特定位置?

    The Location窗体中的属性设置为 0 0 属性窗口 但是 该表单不会在指定位置打开 我错过了什么吗 你需要设置StartPosition手动使表单将起始位置设置为中的值Location财产 public Form1 Initial
  • 在 Python 中将字符串分配给 ID

    我正在使用 python 读取一个文本文件 其格式为每列中的值可以是数字或字符串 当这些值是字符串时 我需要分配该字符串的唯一 ID 在同一列下的所有字符串中都是唯一的 如果同一字符串出现在同一列下的其他位置 则必须分配相同的 ID 什么是
  • Retrofit 2 同步调用错误处理 4xx 错误

    我正在使用 android priority jobqueue 并使用改造来同步调用我的其余 api 但我不确定如何处理诸如 401 Unauthorized 错误之类的错误 我会发回 json 来说明错误 进行异步调用时很简单 但我正在调
  • htonl() 是否会更改 BIG ENDIAN 机器上的字节顺序?

    从字面上看 对 htonl 感到困惑 在很多链接中 我发现执行 htonl 的代码是 define HTONL n unsigned long n 0xFF lt lt 24 unsigned long n 0xFF00 lt lt 8 u
  • 在 MySQL 中插入十六进制值

    我使用 Java 创建了一个 SQL 数据库 我创建了一个表 其中有两列 第一列是一个递增的大整数 第二列我尝试将其定义为 char varchar 和二进制 但我仍然没有获得所需的功能 假设我尝试存储一个十六进制数字0a进入 char 列
  • 我如何判断我是否正在转发到复制构造函数?

    如果我正在编写一个将参数转发给构造函数的通用函数 有没有办法判断它是否是复制构造函数 本质上我想做的是 template
  • PyPdf不逐行读取pdf文本

    我正在使用 PyPdf 从 pdf 文件中读取文本 然而 pyPDF 不会逐行读取 pdf 中的文本 它以某种随意的方式读取 当 pdf 中不存在新行时 将新行放在某处 import PyPDF2 pdf path r C Users PD
  • 如何在.NET MAUI VISUAL STUDIOS 2022中使状态栏完全透明

    所以我发现你可以使用已弃用的代码来使 Android 上的状态栏完全透明 var s SystemUiFlags LayoutFullscreen SystemUiFlags LayoutStable FindViewById Androi
  • 在用户表单中选择图表

    我正在寻找编写一个宏 它从一个图表复制格式并将其应用到多个其他图表 我正在努力做的是确定一种方法来允许用户设置模板图表 然后选择多个其他图表 如果用户知道图表名称 则可以使用组合框来完成此操作 但我尝试在用户不知道图表名称的情况下执行此操作
  • 使用 Jest 测试承诺链

    我正在尝试用 Jest 测试承诺链序列 someChainPromisesMethod function async then async1 then async2 then result catch error 虽然测试单一承诺有很好的记
  • MongoDB Compass 与 WSL2 的问题

    我在 WSL2 内的容器内运行了一个 MongoDB 实例 当我尝试在浏览器中执行请求时localhost 27017即使它显示错误 它仍然可以工作 因为我尝试使用 HTTP 协议访问数据库 但是当我尝试使用主机名 localhost 和端
  • Monostate 是邪恶的 Singleton 的好表弟吗?

    Singleton 绝对是最被误用和滥用的模式之一 我们中的许多人都曾经感染过单侧炎 奇怪的是 它的近亲单态 https segueuserfiles middlebury edu xp SingletonAndMonostate pdf知
  • 序列化/反序列化 Boost.Geometry rtree

    简短版本 是否有任何稳定 可靠的方法来序列化 反序列化 Boost Geometry rtree 较长版本 Boost Geometry 中的 rtree 实现对序列化 反序列化提供了实验性支持 但支持不稳定 在反序列化过程中有时会抛出异常
  • django webapi:将 django 模型转储为 JSON

    我正在尝试将 django 模型转储为 JSON 格式 我尝试这样做 import json from api models import User from django http import HttpResponse def user
  • Android 房间分页不起作用

    我正在尝试使用 android Room API 从页面中的 sqlite 加载记录 问题是分页库正在将整个数据库加载到模型类中并将其与适配器绑定 这使得 UI 线程跳帧 它假设加载 20 条记录 然后在需要时继续添加更多记录 这是我的视图