本指南以分页库概述为基础,描述了如何在应用程序UI中向用户显示信息列表,尤其是在此信息发生变化时。
一、将UI连接到视图模型
您可以将LiveData <PagedList>的实例连接到PagedListAdapter,如以下代码段所示:
public class ConcertActivity extends AppCompatActivity {
private ConcertAdapter mAdapter;
private ConcertViewModel mViewModel;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mViewModel = ViewModelProviders.of(this).get(ConcertViewModel.class);
mViewModel.concertList.observe(this, mAdapter::submitList);
}
}
当数据源提供PagedList的新实例时,活动会将这些对象发送到适配器。 PagedListAdapter实现定义了如何计算更新,并自动处理分页和列表差异。 因此,您的ViewHolder只需要绑定到特定提供的项目:
public class ConcertAdapter
extends PagedListAdapter<Concert, ConcertViewHolder> {
protected ConcertAdapter() {
super(DIFF_CALLBACK);
}
@Override
public void onBindViewHolder(@NonNull ConcertViewHolder holder,
int position) {
Concert concert = getItem(position);
// Note that "concert" can be null if it's a placeholder.
holder.bindTo(concert);
}
private static DiffUtil.ItemCallback<Concert> DIFF_CALLBACK =
new DiffUtil.ItemCallback<Concert>() {
// The ID property identifies when items are the same.
@Override
public boolean areItemsTheSame(Concert oldItem, Concert newItem) {
return oldItem.getId() == newItem.getId();
}
// Use Object.equals() to know when an item's content changes.
// Implement equals(), or write custom data comparison logic here.
@Override
public boolean areContentsTheSame(Concert oldItem, Concert newItem) {
return oldItem.equals(newItem);
}
};
}
PagedListAdapter使用PagedList.Callback对象处理页面加载事件。 当用户滚动时,PagedListAdapter调用PagedList.loadAround()以向底层的PagedList提供关于它应该从DataSource获取哪些项的提示。
注意:PagedList是内容不可变的。 这意味着,虽然可以将新内容加载到PagedList的实例中,但加载的项目本身在加载后无法更改。 因此,如果PagedList中的内容更新,则PagedListAdapter对象将接收包含更新信息的全新PagedList。
二、实现差异回调
上面的示例显示了areContentsTheSame()的手动实现,它比较了相关的对象字段。 您还可以使用基于Java的代码中的Object.equals()方法或基于Kotlin的代码中的==运算符来比较内容,但请确保为要比较或使用的对象实现equals()方法 基于Kotlin的数据类。
使用不同的适配器类型进行区分
如果您选择不从PagedListAdapter继承 - 例如当您使用提供自己的适配器的库时 - 您仍然可以通过直接使用AsyncPagedListDiffer对象来使用Paging Library适配器的diffing功能。
三、在UI中提供占位符
如果您希望UI在应用程序完成获取数据之前显示列表,您可以向用户显示占位符列表项。 RecyclerView通过将列表项本身临时设置为空来处理这种情况。
占位符具有以下好处:
- 支持滚动条:PagedList为PagedListAdapter提供列表项的数量。 此信息允许适配器绘制一个滚动条,传达列表的完整大小。 加载新页面时,滚动条不会跳转,因为列表不会更改大小。
- 无需加载微调器:由于列表大小已知,因此无需提醒用户正在加载更多项目。 占位符本身传达了这些信息。
但是,在添加对占位符的支持之前,请记住以下前提条件:
- 需要可数数据集:Room持久性库中的DataSource实例可以有效地计算其项目。 但是,如果您使用的是自定义本地存储解决方案或仅限网络的数据体系结构,则确定数据集中包含的项目数量可能很昂贵甚至无法实现。
- 需要适配器来考虑卸载的项目:用于准备通胀列表的适配器或表示机制需要处理空列表项。 例如,将数据绑定到ViewHolder时,需要提供默认值来表示卸载的数据。
- 需要相同大小的项目视图大小:如果列表项大小可以根据其内容(例如社交网络更新)进行更改,则项目之间的交叉淡化看起来不太好。 我们强烈建议在这种情况下禁用占位符。
网友评论