【问题标题】:Paging library is not sending any data to my PagedListAdapter分页库没有向我的 PagedListAdapter 发送任何数据
【发布时间】:2018-02-22 12:40:34
【问题描述】:

我有一个带有使用 Room 访问的 SQLite 数据库的 Android 待办事项列表应用程序。然后我想在导航抽屉中列出可用列表。所以我使用了分页库。现在 RecyclerView 是空的,我不知道为什么。顺便说一句:我的列表都不起作用。我是初学者,所以我坚持官方教程。我已经发现,他们错了,ViewModel 需要一个空的构造函数。现在情况如下所示:成功调用设置适配器的方法 (8),创建 ViewModel (7) 创建 Adapter (1),调用 setList() 方法 (9),但是没有创建 Holder (4),没有调用 onCreateViewHolderonBindViewHolder (2,3),没有调用 DiffCalback 方法 (5,6),并且只显示一个空的 Recycler 视图。 PagedList<SQLList> 包含正确的信息,但没有信息传递给适配器。有人知道为什么吗? //对不起我的英语。

适配器类:

//this is my Adapter. SQLList is my object (Equivalent to the User object in 
the tutorial)
public class ListsAdapter extends PagedListAdapter<SQLList,ListsAdapter.Holder> {
private Context context;

public ListsAdapter(Context context) {
//1
    super(DIFF_CALLBACK);
    this.context = context;
}

@Override
public Holder onCreateViewHolder(ViewGroup parent, int viewType) {
    //2
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View view = inflater.inflate(R.layout.list_item,null);
    return new Holder(view);
}

@Override
public void onBindViewHolder(Holder holder, int position) {
    //3
    SQLList item = getItem(position);
    if (item == null){
        holder.clear();
    }else {
        holder.bindTo(item);
    }
}




public static class Holder extends RecyclerView.ViewHolder {
    public TextView textView;
    public int id;
    public TextView idView;

    public Holder(View itemView) {
        //4
        super(itemView);
        textView = itemView.findViewById(R.id.textView);
        idView = itemView.findViewById(R.id.idTextView);
    }

    public void bindTo(SQLList list) {
        textView.setText(list.getName());
        id = list.getId();
        idView.setText(Integer.toString(list.getId()));
    }

    public void clear() {
        textView.setText("");
        id = 0;
        idView.setText("0");
    }
}

private static final DiffCallback<SQLList> DIFF_CALLBACK = new DiffCallback<SQLList>() {
    @Override
    public boolean areItemsTheSame(@NonNull SQLList oldItem, @NonNull SQLList newItem) {
        //5
        return oldItem.getId() == newItem.getId();
    }

    @Override
    public boolean areContentsTheSame(@NonNull SQLList oldItem, @NonNull SQLList newItem) {
        //6
        return oldItem.getName().equals(newItem.getName());
    }
};
}

查看模型:

public static class ListViewModel extends ViewModel {
    public final LiveData<PagedList<SQLList>> listsList;
    public ListViewModel(){
        //7
        listsList = new LivePagedListBuilder<>(DMO.getDao().loadListFactory(),20).build();
    }
}

RecyclerView 所在的片段的一部分:

 ...
 //8
 ListViewModel listViewModel = ViewModelProviders.of(this).get(ListViewModel.class);
    adapter = new ListsAdapter(context);
    listViewModel.listsList.observe(this, new Observer<PagedList<SQLList>>() {
        @Override
        public void onChanged(@Nullable PagedList<SQLList> sqlLists) {
          //9  
          adapter.setList(sqlLists);
        }
    });
    recyclerView.setAdapter(adapter);
...

【问题讨论】:

  • @pskink 列表成功传递给PagedListAdapterHelpergetItemCount() 返回正确的值。

标签: android android-room android-paging


【解决方案1】:

发现问题:我忘记设置布局管理器了!

【讨论】:

    【解决方案2】:

    我有同样的问题,但我不小心添加了-

    RecyclerView.setHasFixedSize(true);
    

    删除后,它起作用了。

    【讨论】:

    • 你是救生员!
    • 花了将近一个月的时间才明白这一点,谢谢你终于可以擦除这条线了
    【解决方案3】:

    我遇到了同样的问题,我刚刚删除了 RecyclerView.setHasFixedSize(true) 然后它开始正常工作。

    【讨论】:

      【解决方案4】:

      我必须设置适配器。 recyclerView.setAdapter(adapter);

      【讨论】:

      • 它在代码中。无论如何,好点子,有人可能会忘记。
      猜你喜欢
      • 2022-11-26
      • 1970-01-01
      • 2020-09-19
      • 2019-12-12
      • 1970-01-01
      • 2018-10-23
      • 1970-01-01
      • 1970-01-01
      • 2022-09-24
      相关资源
      最近更新 更多