Android房间分页不起作用

Posted

技术标签:

【中文标题】Android房间分页不起作用【英文标题】:Android Room Pagination not working 【发布时间】:2018-07-28 15:38:39 【问题描述】:

我正在尝试使用 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));
        
    

与回收站视图绑定:

  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/Paging: 页面 200

知道我错过了什么。

【问题讨论】:

检查您的RecyclerView 以查看方法onMeasure 是否没有返回比预期更大的高度(可能预期是屏幕大小附近的东西)。有时RecyclerView 的实际高度比屏幕大得多,适配器调用getView() 获取项目总数而不是我们可以看到的数量。这将触发DataSource 查询数据库并在您想要之前绑定视图。 【参考方案1】:

通过分页实现,您的结果计数确实应该是查询的完整大小(200),正如您配置的那样,RecyclerView 将接收占位符null 用于数据尚未准备好的视图.这适用于您想要显示整个列表视图但仅在数据可用时绑定其内容的情况。但是你的RecyclerView 不应该调用onCreateViewHolderonBindViewHolder,除非它是可见的。

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

【讨论】:

【参考方案2】:

尝试 userUserAdapter.setList(pagedList);拿出观察。观察使用监听器列表的变化。你 。您需要初始化列表并正常设置recyclerview。 对象列表应该以通常的方式包含在 pageAdapter 中

【讨论】:

【参考方案3】:

您应该致电userUserAdapter.submitList(pagedList)setList() 用于RecyclerView.Adapter 而不是PagedListAdapter

【讨论】:

以上是关于Android房间分页不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为啥分页不起作用并在 wordpress 网站上出现 404 错误?

RecyclerView分页不起作用

为啥我在 codeigniter 中的分页不起作用? (404 未找到)

数据表分页不起作用?

ExtJs 网格分页不起作用

ngx-分页单击下一页不起作用