2016-04-19 2 views
0

У меня проблема с кэшем Picasso (я так думаю). Я создал RecyclerView и RecyclerView.Adapter. Один элемент в списке содержит ImageView. Для этого ImageView я загружаю изображение, используя библиотеку Пикассо, как это:Recyclerview, otifyItemChanged() и изображение, загруженное 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

Вы не должны использовать holder.getAdapterPosition() для этого, как RecyclerView JavaDoc states:

[...] вы должны только использовать параметр позиции, приобретая соответствующий элемент данных внутри этого метода и не должны иметь его копию. Если вам понадобится позиция позиции позже (например, в прослушивателе кликов), используйте getAdapterPosition(), у которого будет обновленная позиция адаптера.

Таким образом, не используйте getAdapterPosition(), если вы не уверены, что она будет выполняться асинхронно неизвестными факторами, такими как взаимодействие с пользователем (то есть. Внутри мыши или сенсорного слушателя).

Для первой загрузки держателя вида используйте аргумент position из метода onBindViewHolder(ViewHolder holder, int position), который будет представлять собой данные в адаптере ресайклера.

Смежные вопросы