Every time I call invalidate data my DIFF_UTIL is not used. The logs are not shown and the entire list is updated with new data causing the screen to move positions etc. Not sure what the issue is here.
I have PagedListAdapter with a LiveData<PagedList<Post>> postList and I call postList.getValue().getDataSource().invalidate(); to refresh my data.
I have 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);
}
};
I have my Adapter:
import...
public class PostAdapter extends PagedListAdapter<Post, PostAdapter.PostViewHolder> {
private static final String TAG = PostAdapter.class.getName();
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
}
private void setPostTexts(@NonNull PostViewHolder holder, @NonNull Post post) {
holder.postText.setText(
post.getText() + "\n" + likes);
holder.postDate.setText(post.getCreationDate().toString());
holder.postScore.setText(post.getScore() + "");
holder.postComments.setText(post.getNumberOfComments() + "");
holder.postAnswers.setText(post.getNumberOfAnswers() + "");
}
class PostViewHolder extends RecyclerView.ViewHolder {
Buttons etc..
public PostViewHolder(View itemView) {
super(itemView);
button b = findviewbyid...
}
void clear() {
button.invalidate()..
}
}
}
My 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;
}
I following the google example here: https://developer.android.com/reference/android/arch/paging/PagedListAdapter.html
from PagedListAdapter Not Using DiffUtil On invalidate Data
No comments:
Post a Comment