¿Cómo puedo hacer que RecyclerView actualice su diseño?

Tengo un RecyclerView con un montón de vistas personalizadas que pueden cambiar de altura después de un tiempo, ya que contienen ImageView s que cargan su imagen de forma asíncrona. El RecyclerView no recoge este cambio de diseño, aunque llamo forceLayout en ImageView y el RecyclerView se inicializa con setHasFixedSize(false) . Todos los padres contenedores de ImageView han establecido android:layout_height="wrap_content" .

¿Cómo puedo hacer que el RecyclerView actualice su diseño? Con good'ol ListView esto no fue un problema.

Puede utilizar notifyDataSetChanged en el Adapter para RecyclerView si todas sus imágenes cambian al mismo tiempo o notifyItemChanged(int position) si sólo ha cambiado uno de los elementos. Esto le indicará al RecyclerView que vuelva a vincular la View particular.

Google finalmente ha arreglado esto en la biblioteca de soporte v23.2 . El problema se corrige al actualizar esta línea en build.gradle después de actualizar su repositorio de soporte con SDK Manager:

 compile 'com.android.support:recyclerview-v7:23.2.0' 

Llame a los notifyDataSetChanged() o notifyItemChanged(int position) del RecyclerView.Adapter de la MAIN THREAD . Llamarlo desde un AsyncTask puede dar como resultado que el subproceso principal no actualice el ImageView . Su más conveniente tener un método de la devolución de llamada en el trabajo de la actividad / del fragmento como oyente, y tenerlo llamado por el AsyncTask en onPostExecute()

 int wantedPosition = 25; // Whatever position you're looking for int firstPosition = linearLayoutManager.findFirstVisibleItemPosition(); // This is the same as child #0 int wantedChild = wantedPosition - firstPosition; if (wantedChild < 0 || wantedChild >= linearLayoutManager.getChildCount()) { Log.w(TAG, "Unable to get view for desired position, because it's not being displayed on screen."); return; } View wantedView = linearLayoutManager.getChildAt(wantedChild); mlayoutOver =(LinearLayout)wantedView.findViewById(R.id.layout_over); mlayoutPopup = (LinearLayout)wantedView.findViewById(R.id.layout_popup); mlayoutOver.setVisibility(View.INVISIBLE); mlayoutPopup.setVisibility(View.VISIBLE); 

Este código funciona para mí.

Tuve el mismo problema, acabo de fijar una anchura y una altura fijas para el ImageView. Intente eso y vea donde usted consigue. También puedes usar un lib para esto, yo uso Square Picasso y lo conseguí trabajando con RecyclerView.

  • Desactivar eventos táctiles de RecyclerView (para evitar toques de usuario)?
  • Inconsistencia detectada en RecyclerView, Cómo cambiar el contenido de RecyclerView mientras se desplaza
  • Android: Sugerencia necesaria para actualizar la vista del reciclador en el elemento seleccionado de la ruleta
  • Desactivar desplazamiento para posición en RecyclerView utilizando ItemTouchHelper.SimpleCallback
  • Cómo resaltar correctamente el elemento seleccionado en RecyclerView?
  • Recyclerview notifyDataSetChanged (); no funciona
  • Recyclerview Sin adaptador conectado; Saltar el diseño
  • Distancia entre RecyclerView demasiado lejos
  • ¿Cómo se relaciona la posición de un adaptador de RecyclerView con el índice de su conjunto de datos?
  • Encabezado RecyclerView bajo elementos de Android
  • TableLayout con RecyclerView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.