Ich habe eine RecyclerView
mit einer Reihe von benutzerdefinierten Ansichten, deren Höhe sich nach einer Weile ändern kann, da sie ImageView
s 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.
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'
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.
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 ImageView
s 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.
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.
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.