android android-recyclerview fresco

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 por tu tiempo si llegaste tan lejos. Por favor, avíseme si pueden ser útiles más detalles e intentaré proporcionarlos.

Gracias de nuevo.