Android Room Pagination无效

时间:2018-02-18 04:59:54

标签: android paging android-room

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

问题是Paging库正在将整个数据库加载到模型类中,并将其与正在制作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:Page   200

知道我错过了什么。

3 个答案:

答案 0 :(得分:0)

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

onMeasure上检查(放置一个断点)方法onLayoutRecyclerView,看看该方法的返回高度是否超出预期(可能是预期的是屏幕大小)。有时,RecyclerView的实际高度比屏幕和适配器调用onBindViewHolder()大得多,因为它可以看到&#34;可见&#34;而不是我们可以看到的数字。这将触发DataSource查询数据库并在您想要之前绑定视图。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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