2016-04-19 49 views
0

我有问题与毕加索缓存(我认为是这样)。我创建了RecyclerView和RecyclerView.Adapter。列表中的单个项目包含ImageView。为了这个ImageView的我用毕加索库这样的加载图片:Recyclerview,otifyItemChanged()和毕加索加载的图像

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

你不应该使用holder.getAdapterPosition()此,为RecyclerView JavaDoc states

[...]在获取这种方法内的相关数据项,你应该只使用位置参数,不应继续它的副本。如果您需要后面的(例如在点击监听器中)的位置,请使用getAdapterPosition(),该getAdapterPosition()将具有更新的适配器位置。

因此,除非您确定它将被未知因素异步执行,例如用户交互(即在点击或触摸侦听器中),否则不要使用getAdapterPosition()

对于查看持有者的第一次加载,请使用onBindViewHolder(ViewHolder holder, int position)方法中的position参数,这将是数据在回收站的适配器中的位置。