Recyclerview,otifyItemChanged()和Picasso加载的图像

时间:2016-04-19 21:33:14

标签: android android-recyclerview picasso recycler-adapter

我对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中。

1 个答案:

答案 0 :(得分:0)

您不应该使用holder.getAdapterPosition()作为RecyclerView JavaDoc states

  

[...]你只应该在获取此方法中的相关数据项时使用position参数,并且不应该保留它的副本。如果您需要项目 以后 的位置(例如在点击侦听器中),请使用具有更新的适配器位置的getAdapterPosition()。

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

对于View Holder的第一次加载,请使用position方法中的onBindViewHolder(ViewHolder holder, int position)参数,该参数将是回收站适配器中数据的位置。