我有一个显示提要的片段,每次用户滚动时,都会通过在UI线程上调用notifyDataSetChanged方法来更新适配器。
这是更新适配器的有效方法吗?
这里是加载数据的方法。
private void Load(final int page) {
myApollo.getApolloClient().query(GetpopularQuery.builder().page(page).build()).enqueue(new ApolloCall.Callback<GetpopularQuery.Data>() {
@Override
public void onResponse(@Nonnull final Response<GetpopularQuery.Data> response) {
popular.addAll(response.data().Page().media());
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
adapter.notifyDataSetChanged();
}
});
}`
答案 0 :(得分:0)
在UI线程上调用notifyDataSetChanged()很好,但是你应该在后台线程上加载数据。在UI线程上加载数据可能会导致应用程序挂起或崩溃,如果数据需要很长时间才能加载。 Android去年推出了一个名为Paging Library的架构组件,可以更轻松地将数据加载到您的Recyclerview中。我强烈建议阅读文档。
答案 1 :(得分:0)
我认为现在使用DiffUtils
通知适配器有关数据集更改的最简单且最推荐的方法。它使您可以决定哪些项目已更改,哪些项目是新项目等。您需要扩展DiffUtils.Callback
并实施一些方法:
class DiffCallback(): DiffUtil.Callback() {
override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
}
override fun getOldListSize(): Int {
}
override fun getNewListSize(): Int {
}
override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
}
}
并设置DiffUtils以通知您的适配器:
val diffUtil = DiffUtil.calculateDiff(DiffCallback(oldElements, newElements))
oldElements.clear()
oldElements.addAll(newElements)
diffUtil.dispatchUpdatesTo(this)