我对Picasso缓存有问题(我想是这样)。我创建了RecyclerView和RecyclerView.Adapter。列表中的单个项目包含ImageView。对于这个imageView我使用Picasso库加载图像:
public void onBindViewHolder(PageViewHolder holder, int position) {
final int positionAdp = holder.getAdapterPosition();
(new Picasso.Builder(mContext).addRequestHandler(new PageThumbRequestHandler(mPagesContainer.get()))
.build())
.load(PageThumbRequestHandler.REQUEST_SCHEME + "://" + mPages.get(positionAdp).mTag)
.memoryPolicy(MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE)
.networkPolicy(NetworkPolicy.NO_CACHE)
.into(holder.mThumbView);
holder.mThumbView.setTag(mPages.get(positionAdp).mTag);
holder.mThumbView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String tag = (String) v.getTag();
mPageListener.onPageSelected(tag);
}
});
holder.mLp.setText(Integer.toString(mPages.get(positionAdp).mLp));
}
当我更新项目时,我调用notifyItemChanged方法。在屏幕上,我看到更新的项目正在轻弹,因此项目无效正确。但是没有显示新的拇指 - 我总是先将第一个加载的位图加载到ImageView中。
答案 0 :(得分:0)
您不应该使用holder.getAdapterPosition()
作为RecyclerView JavaDoc states:
[...]你只应该在获取此方法中的相关数据项时使用position参数,并且不应该保留它的副本。如果您需要项目 以后 的位置(例如在点击侦听器中),请使用具有更新的适配器位置的getAdapterPosition()。
因此,不要使用getAdapterPosition()
,除非您确定它将由未知因素异步执行,例如用户交互(即在点击或触摸侦听器内)。
对于View Holder的第一次加载,请使用position
方法中的onBindViewHolder(ViewHolder holder, int position)
参数,该参数将是回收站适配器中数据的位置。