就我而言,上述任何一个问题以及其他具有相同问题的 stackoverflow 问题的答案都不起作用。
好吧,我每次点击项目时都使用自定义动画,为此我调用 notifyItemChanged(int position, Object Payload) 将有效负载传递给我的 CustomAnimator 类。
注意,RecyclerView 适配器中有 2 个 onBindViewHolder(...) 方法可用。
具有 3 个参数的 onBindViewHolder(...) 方法将始终在具有 2 个参数的 onBindViewHolder(...) 方法之前调用。
通常,我们总是覆盖具有 2 个参数的 onBindViewHolder(...) 方法,而问题的主要根源是我也在做同样的事情,
每次调用 notifyItemChanged(...) 时,都会调用我们的 onBindViewHolder(...) 方法,在该方法中,我使用 Picasso 在 ImageView 中加载图像,这就是它再次加载的原因,不管它是从内存中加载的或来自互联网。在加载之前,它会向我显示占位符图像,这就是每当我单击 itemview 时闪烁 1 秒的原因。
稍后,我还重写了另一个具有 3 个参数的 onBindViewHolder(...) 方法。这里我检查payload列表是否为空,然后返回该方法的超类实现,否则如果有payload,我只是将holder的itemView的alpha值设置为1。
很遗憾,在浪费了一整天之后,我找到了解决问题的方法!
这是我的 onBindViewHolder(...) 方法的代码:
onBindViewHolder(...) 带 2 个参数:
@Override
public void onBindViewHolder(@NonNull RecyclerAdapter.ViewHolder viewHolder, int position) {
Movie movie = movies.get(position);
Picasso.with(context)
.load(movie.getImageLink())
.into(viewHolder.itemView.posterImageView);
}
onBindViewHolder(...) 带 3 个参数:
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position, @NonNull List<Object> payloads) {
if (payloads.isEmpty()) {
super.onBindViewHolder(holder, position, payloads);
} else {
holder.itemView.setAlpha(1);
}
}
这是我在 onCreateViewHolder(...) 中 viewHolder 的 itemView 的 onClickListener 中调用的方法代码:
private void onMovieClick(int position, Movie movie) {
Bundle data = new Bundle();
data.putParcelable("movie", movie);
// This data(bundle) will be passed as payload for ItemHolderInfo in our animator class
notifyItemChanged(position, data);
}
注意:您可以通过 onCreateViewHolder(...) 调用 viewHolder 的 getAdapterPosition() 方法来获取此位置。
我还重写了 getItemId(int position) 方法,如下所示:
@Override
public long getItemId(int position) {
Movie movie = movies.get(position);
return movie.getId();
}
并在我的适配器对象上调用setHasStableIds(true);。
如果以上答案都不起作用,希望这会有所帮助!