android - Fresco: Las imágenes desaparecen después de desplazarse RecylcerView
android-recyclerview (1)
Desde el Logcat puede ver que está utilizando la misma instancia de DraweeHierarchy con múltiples controladores. No hagas eso.
AbstractDraweeController: controller c077610 8: setHierarchy: com.facebook.drawee.generic.GenericDraweeHierarchy@d36ab12
AbstractDraweeController: controller 87baf9c null -> 9: initialize
AbstractDraweeController: controller c077610 8: setHierarchy: null
AbstractDraweeController: controller 87baf9c 9: setHierarchy: com.facebook.drawee.generic.GenericDraweeHierarchy@d36ab12
Como se explica en la documentación , no reutilice DraweeHierarchies
. Cada DraweeView
necesita tener su propia instancia de una DraweeHierarchy
. No almacene la jerarquía en mHierarchy
, simplemente configure la jerarquía para la vista.
Además, cada vista necesita su propia jerarquía, pero eso no significa que tenga que crear una nueva jerarquía cada vez que quiera establecer una nueva imagen. Construyes la jerarquía solo una vez, cuando creas la vista y eso es todo. Más tarde, cuando necesite configurar / cambiar una imagen, simplemente configure un nuevo controlador para la vista.
Según su ejemplo, parece que no necesita construir la jerarquía programáticamente. Puede especificar tanto la duración del fundido como el marcador de posición en XML. Por cierto, el valor predeterminado para la duración del fundido es de 300ms, por lo que también puedes omitir esa parte. Por lo tanto, solo elimine el código que crea y establece la jerarquía ( mDraweeView.setHierarchy(mHierarchy)
).
Si solo está utilizando el Uri sin ninguna opción adicional, no necesita construir el controlador. Solo haga mDraweeView.setImageURI(uri)
y SimpleDraweeView
creará el controlador por usted.
Tengo un RecyclerView horizontal: cada elemento tiene una imagen cargada en él utilizando la biblioteca de imágenes de Facebook Fresco. Sin embargo, aunque la imagen correcta se carga inicialmente a medida que se desplaza un poco hacia la pantalla, desaparece cuando se desplaza RecyclerView.
Además, hay problemas en los que desplazarse de un lado a otro coloca la imagen incorrecta en el elemento incorrecto (supongo que esto es un problema con el reciclaje de los usuarios). Dicho esto, el texto que puede ver superpuesto a los elementos en la captura de pantalla siguiente siempre se muestra de forma consistente en el elemento correcto, por lo que este problema de reciclaje es exclusivo de las imágenes.
Puedo confirmar que paso el SimpleDraweeView la URL correcta cada vez.
A continuación se muestran algunas pantallas y registros que lo acompañan:
Captura de pantalla 1: muestra la imagen correcta que ingresa desde la derecha.
Registros como esto se desplaza en la pantalla y la imagen se carga con éxito:
AbstractDraweeController: controller cbb6b5b 5: onTouchEvent MotionEvent { action=ACTION_DOWN, actionButton=0, id[0]=0, x[0]=32.860107, y[0]=198.16406, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=464189, downTime=464189, deviceId=0, source=0x1002 }
AbstractDraweeController: controller c077610 8: setHierarchy: com.facebook.drawee.generic.GenericDraweeHierarchy@d36ab12
AbstractDraweeController: controller 87baf9c null -> 9: initialize
AbstractDraweeController: controller c077610 8: setHierarchy: null
AbstractDraweeController: controller 87baf9c 9: setHierarchy: com.facebook.drawee.generic.GenericDraweeHierarchy@d36ab12
AbstractDraweeController: controller 87baf9c 9: onAttach: request needs submit
PipelineDraweeController: controller 87baf9c: getDataSource
AbstractDraweeController: controller 87baf9c 9: submitRequest: dataSource: ad37da5
BufferedDiskCache: Did not find image for http://i.imgur.com/OVwFM9ub.jpg in staging area
BufferedDiskCache: Disk cache read for http://i.imgur.com/OVwFM9ub.jpg
BufferedDiskCache: Found entry in disk cache for http://i.imgur.com/OVwFM9ub.jpg
NativeMemoryChunkPool: Used = (7, 188416); Free = (0, 0)
NativeMemoryChunkPool: get (alloc) (object, size) = (ef2f57a, 16384)
GenericByteArrayPool: Used = (1, 16384); Free = (0, 0)
GenericByteArrayPool: get (reuse) (object, size) = (cf34727, 16384)
GenericByteArrayPool: release (reuse) (object, size) = (cf34727, 16384)
GenericByteArrayPool: Used = (0, 0); Free = (1, 16384)
BufferedDiskCache: Successful read from disk cache for http://i.imgur.com/OVwFM9ub.jpg
TiffUtil: Unsupported orientation
BitmapPool: Used = (7, 2831360); Free = (0, 0)
BitmapPool: get (alloc) (object, size) = (8622988, 102400)
AbstractDraweeController: controller 87baf9c 9: set_final_result @ onNewResult: image: CloseableReference 1a34f21
Captura de pantalla 2: muestra el RecyclerView después de desplazarse más de derecha a izquierda. Esto muestra que la imagen que se cargó previamente en ViewHolder ahora ha desaparecido.
Los siguientes registros se producen entre las capturas de pantalla 1 y 2:
AbstractDraweeController: controller cbb6b5b 5: onTouchEvent MotionEvent { action=ACTION_DOWN, actionButton=0, id[0]=0, x[0]=103.65283, y[0]=144.14063, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=793409, downTime=793409, deviceId=0, source=0x1002 }
AbstractDraweeController: controller 87baf9c 9: onDetach
AbstractDraweeController: controller e14aa9d 2: onDetach
AbstractDraweeController: controller 87baf9c 9: release: image: CloseableReference 1a34f21
AbstractDraweeController: controller e14aa9d 2: release: image: CloseableReference 61f0be9
Código: ViewHolder XML
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:fresco="http://schemas.android.com/apk/res-auto"
android:layout_width="120dp"
android:layout_height="match_parent"
android:background="#993366">
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/recycler_drawee_view"
android:layout_width="110dp"
android:layout_height="match_parent"
android:background="#336699"
fresco:placeholderImage="@drawable/placeholder" />
<TextView
android:id="@+id/recycler_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TEST" />
</FrameLayout>
Código: configuración SimpleDraweeView
GenericDraweeHierarchyBuilder builder =
new GenericDraweeHierarchyBuilder(context.getResources());
mHierarchy = builder
.setFadeDuration(300)
.setPlaceholderImage(context.getDrawable(R.drawable.placeholder))
.build();
...
mDraweeView.setHierarchy(mHierarchy);
Uri uri = Uri.parse(imageLink);
DraweeController controller = Fresco.newDraweeControllerBuilder()
.setUri(uri)
.build();
mDraweeView.setController(controller);
Código: RecyclerView.Adapter
@Override
public SimpleHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(mContext).inflate(R.layout.recycler_view_item, viewGroup, false);
return new SimpleHolder(view, mHierarchy);
}
...
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
holder.setText(EntryUtils.getFullCaption(mData.get(position)));
holder.setImage(EntryUtils.getThumbnailLink(mData.get(position)));
}
Gracias de nuevo.