webentwicklung-frage-antwort-db.com.de

Wie lasse ich RecyclerView das Layout aktualisieren?

Ich habe eine RecyclerView mit einer Reihe von benutzerdefinierten Ansichten, deren Höhe sich nach einer Weile ändern kann, da sie ImageViews enthalten, die ihr Bild asynchron laden. Die RecyclerView greift diese Layoutänderung nicht auf, obwohl ich forceLayout für die ImageView aufrufe und die RecyclerView mit setHasFixedSize(false) initialisiert wird. Alle Container-Eltern der ImageView haben Android:layout_height="wrap_content" gesetzt.

Wie kann ich die RecyclerView ihr Layout aktualisieren lassen? Mit good'ol ListView war dies kein Problem. 

30
Nilzor

Google hat dieses Problem schließlich in support library v23.2 behoben. Das Problem wird behoben, indem diese Zeile in build.gradle aktualisiert wird, nachdem das Support-Repository mit dem SDK-Manager aktualisiert wurde:

compile 'com.Android.support:recyclerview-v7:23.2.0'
10
Nilzor

Sie können die notifyDataSetChanged in der Adapter für die RecyclerView verwenden, wenn sich alle Ihre Bilder gleichzeitig ändern, oder notifyItemChanged(int position), wenn sich nur eines der Elemente geändert hat. Dadurch wird die RecyclerView angewiesen, die bestimmte View erneut zu binden.

21
Barad

Rufen Sie die notifyDataSetChanged()- oder notifyItemChanged(int position)-Methoden des RecyclerView.Adapter vom MAIN THREAD auf. Ein Aufruf von einer AsyncTask kann dazu führen, dass der Haupt-Thread die ImageViews nicht aktualisiert. Am bequemsten ist es, wenn eine Callback-Methode in der Aktivität/Fragment als Listener fungiert und von der AsyncTask in onPostExecute() aufgerufen wird.

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);

Dieser Code wird für mich bearbeitet.

2
Libin Thomas

Ich hatte das gleiche Problem, ich habe nur eine feste Breite und Höhe für ImageView festgelegt. Versuchen Sie das und sehen Sie, wo Sie hinkommen. Sie können auch eine lib verwenden, ich benutze Square Picasso und habe es mit RecyclerView zum Laufen gebracht.

0
PaulNunezM