gpt4 book ai didi

android - PagedListAdapter 不使用 DiffUtil 使数据无效

转载 作者:行者123 更新时间:2023-12-02 16:41:40 27 4
gpt4 key购买 nike

每次我调用无效数据时,我的 DIFF_UTIL 都不会被使用。日志未显示,整个列表已更新为新数据,导致屏幕移动位置等。不确定这里的问题是什么。

我有PagedListAdapterLiveData<PagedList<Post>> postList我打电话postList.getValue().getDataSource().invalidate();刷新我的数据。

我有DIFF_UTIL

 public static DiffUtil.ItemCallback<Post> DIFF_CALLBACK =
new DiffUtil.ItemCallback<Post>() {

@Override
public boolean areItemsTheSame(Post oldItem, Post newItem) {
Log.d(TAG, "areItemsTheSame with result: "
+ (oldItem.getId() == newItem.getId()));
Log.d(TAG, "areItemsTheSame Old Item is: " + oldItem.toString());
Log.d(TAG, "areItemsTheSame New Item is: " + newItem.toString());
return oldItem.getId() == newItem.getId();
}

@Override
public boolean areContentsTheSame(Post oldItem, Post newItem) {
Log.d(TAG, "areContentsTheSame with result: " + oldItem.equals(newItem));
Log.d(TAG, "areContentsTheSame Old Item is: " + oldItem.toString());
Log.d(TAG, "areContentsTheSame New Item is: " + newItem.toString());
return oldItem.equals(newItem);
}
};

我有我的适配器:

import...

public class PostAdapter extends PagedListAdapter<Post, PostAdapter.PostViewHolder> {
interface...

protected PostAdapter() {
super(DIFF_CALLBACK);
}

@NonNull
@Override
public PostViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater
.from(parent.getContext()).inflate(R.layout.feed_card_view, parent, false);
return new PostViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull PostViewHolder holder, int position) {
Post post = getItem(position);
Log.d(TAG, "onBindViewHolder with position: " + position);
if (post != null) {
setUpPost(holder, post);
Log.d(TAG, "onBindViewHolder with post: " + post.toString());
} else {
holder.clear();
Log.d(TAG, "onBindViewHolder post is null");
}
}

private void setUpPost(@NonNull PostViewHolder holder, @NonNull Post post) {
...do some things to set up post
}

class PostViewHolder extends RecyclerView.ViewHolder {
Buttons etc..

public PostViewHolder(View itemView) {
super(itemView);
button b = findviewbyid...
}

void clear() {
button.invalidate()..
}
}
}

我的 fragment

 @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View v = inflater.inflate(R.layout.fragment_feed, container, false);
feedViewModel = ViewModelProviders.of(getActivity()).get(FeedViewModel.class);

RecyclerView recyclerView = v.findViewById(R.id.post_list);
PostAdapter adapter = new PostAdapter(this);

feedViewModel.postList.observe(this, pagedList -> {
try {
//refresh current list
adapter.submitList(pagedList);
} catch (Exception e) {}
});


recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(this.getActivity()));

return v;
}

我的 View 模型

public class FeedViewModel extends AndroidViewModel {
private LiveData<PagedList<Post>> postList;
private FeedRepository feedRepository;

public FeedViewModel(final Application application) {
super(application);
feedRepository = new FeedRepository();
postList = feedRepository.getPosts();
}

public void refreshPosts() {
feedRepository.refreshPosts();
}

...

public LiveData<PagedList<Post>> getPostList() {
return postList;
}
}

存储库

public class FeedRepository {
private LiveData<PagedList<Post>> postList;

private static final String TAG = FeedRepository.class.getName();
private static final int NUMBER_OF_POSTS_TO_GET = 2;
private static final boolean ENABLE_POST_PAGE_HOLDER = true;
private static final int NUMBER_OF_POSTS_TO_GET_IN_ADVANCE = 50;
private static final int NUMBER_OF_POSTS_ON_FIRST_LOAD = 20;

public FeedRepository() {
//Prefs on PagedList
PagedList.Config myPagingConfig = new PagedList.Config.Builder()
.setPageSize(NUMBER_OF_POSTS_TO_GET)
.setEnablePlaceholders(ENABLE_POST_PAGE_HOLDER)
.setPrefetchDistance(NUMBER_OF_POSTS_TO_GET_IN_ADVANCE)
.setInitialLoadSizeHint(NUMBER_OF_POSTS_ON_FIRST_LOAD)
.build();

PostDataSourceFactory postDataSourceFactory = new PostDataSourceFactory();

postList = new LivePagedListBuilder(
postDataSourceFactory, myPagingConfig).build();
}

public LiveData<PagedList<Post>> getPosts() {
return postList;
}

public void refreshPosts() {
Log.d(TAG, "refreshPosts, invalidateDataSources()");
postList.getValue().getDataSource().invalidate();
}
}

数据源.Factory

public class PostDataSourceFactory extends DataSource.Factory<String, Post> {
public PostDataSourceFactory() {
}

@NonNull
@Override
public DataSource<String, Post> create() {
PostDataSource postDataSource = new PostDataSource();
return postDataSource;
}
}

我在这里遵循谷歌示例:https://developer.android.com/reference/android/arch/paging/PagedListAdapter.html

最佳答案

对于其他遇到“DiffUtil.ItemCallback<*>()”部分问题的人,我也遇到了同样的问题。

每次我想刷新数据时,我都会对“DataSource”对象调用 invalidate(),具体取决于您继承的数据源的类型,但是 2 个回调“areItemsTheSame()”和“areContentsTheSame ()”没有被触发。

所以我发现了这个链接:How to stop blinking on recycler view with architecture components paging library

对我来说,诀窍是在提交“pagedList”时使用“AsyncPagedListDiffer”。以下代码采用 Kotlin 语言。

fun submitList(pagedList: PagedList<*?>) {
pagedList.addWeakCallback(pagedList.snapshot(), object : PagedList.Callback() {
override fun onChanged(position: Int, count: Int) {
}

override fun onInserted(position: Int, count: Int) {
mDiffer.submitList(pagedList)
}

override fun onRemoved(position: Int, count: Int) {
}

})
}

通过添加这些东西,我的 diff 回调开始工作

关于android - PagedListAdapter 不使用 DiffUtil 使数据无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58016613/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com