web-dev-qa-db-fra.com

Comment faire pour que RecyclerView mette à jour sa mise en page?

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 ImageViews 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. 

30
Nilzor

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'
10
Nilzor

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.

21
Barad

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 ImageViews. 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()

5
Edwin Muigai
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.

2
Libin Thomas

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.

0
PaulNunezM