J'ai une RecyclerView
avec un ensemble de vues personnalisées qui peuvent changer de hauteur après un certain temps, car elles contiennent des ImageView
s qui chargent leur image de manière asynchrone. La RecyclerView
ne détecte pas ce changement de présentation, bien que j'appelle forceLayout
sur la ImageView
et que la RecyclerView
soit initialisée avec setHasFixedSize(false)
. Tous les parents de conteneur de la ImageView
ont défini Android:layout_height="wrap_content"
.
Comment puis-je faire mettre la RecyclerView
mettre à jour sa mise en page? Avec good'ol ListView
, ce n'était pas un problème.
Google a finalement résolu ce problème dans support library v23.2 . Le problème est résolu en mettant à jour cette ligne dans build.gradle
après la mise à jour de votre référentiel de support avec le SDK Manager:
compile 'com.Android.support:recyclerview-v7:23.2.0'
Vous pouvez utiliser notifyDataSetChanged
dans Adapter
pour RecyclerView
si toutes vos images changent en même temps ou notifyItemChanged(int position)
si un seul des éléments a été modifié. Cela indiquera à la RecyclerView
de relier la View
particulière.
Appelez les méthodes notifyDataSetChanged()
ou notifyItemChanged(int position)
du RecyclerView.Adapter
à partir du MAIN THREAD . L'appeler d'une AsyncTask
peut avoir pour conséquence que le thread principal ne mette pas à jour les ImageView
s. Il est plus pratique d’avoir une méthode de rappel dans l’activité/le fragment qui fonctionne en tant qu’auditeur et de la faire appeler par le AsyncTask
dans 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);
Ce code est travaillé pour moi.
J'ai eu le même problème, je viens de définir une largeur et une hauteur fixes pour ImageView. Essayez cela et voyez où vous obtenez. Vous pouvez également utiliser une bibliothèque pour cela, j'utilise Square Picasso et je l’utilise avec RecyclerView.