Bisher verwende ich die folgenden alten Support-Bibliotheken "23.1.1".
compile 'com.Android.support:appcompat-v7:23.1.1'
compile 'com.Android.support:support-v4:23.1.1'
compile 'com.Android.support:preference-v7:23.1.1'
compile 'com.Android.support:preference-v14:23.1.1'
compile 'com.Android.support:design:23.1.1'
compile 'com.Android.support:recyclerview-v7:23.1.1'
Es funktioniert ziemlich gut So sieht mein RecyclerView
aus
Jetzt möchte ich auf "23.2.1" migrieren, da einige Fehler behoben wurden.
compile 'com.Android.support:appcompat-v7:23.2.1'
compile 'com.Android.support:support-v4:23.2.1'
compile 'com.Android.support:preference-v7:23.2.1'
compile 'com.Android.support:preference-v14:23.2.1'
compile 'com.Android.support:design:23.2.1'
compile 'com.Android.support:recyclerview-v7:23.2.1'
Plötzlich scheinen jedoch alle meine RecyclerView
Gegenstände die RecyclerView
gesamte Höhe auszufüllen.
Hier ist der Codeausschnitt meiner Layoutdatei: https://Gist.github.com/yccheok/241a0d38d56305a1be24d09b54eb16
Was mich wirklich verwundert, ist, dass ich zwar "wrap_content"
In meinem Artikellayout für die Recycling-Ansicht verwende, dies jedoch nicht wie erwartet funktioniert.
Ich verwende keinen benutzerdefinierten Layout-Manager für mein RecyclerView
.
Aus http://developer.Android.com/tools/support-library/index.html ist mir klar, dass 23.2.1 dieses Mal eine ganze Reihe von Änderungen an RecyclerView
vornimmt.
RecyclerView
beim Berechnen eines Layouts oder Bildlaufs keine Adapteränderungen zulässt, wurde verringert. (Problem 202046)notifyItemChanged()
für ein Element, das nicht sichtbar ist, wurde behoben. (Problem 202136)RecyclerView.LayoutManager
Eine Ansicht im selben Messdurchgang hinzufügte und entfernte. (Problem 193958)Was ich am meisten vermute, ist https://code.google.com/p/Android/issues/detail?id=201856 , da es sich um das Ändern verschiedener Maße handelt. Spezifikationsmethoden
Bisher habe ich versucht, das Problem mit einem einfachen RecyclerView
-Projekt mit 23.2.1 zu reproduzieren, aber es ist fehlgeschlagen! Es gibt kein Problem mit "item füllt die RecyclerView
gesamte Höhe aus". Ich vermute, mein einfaches Projekt simuliert nicht die komplexe Layoutstruktur meines Produktionsprojekts. Mein Produktionsprojekt hat das folgende Layout
<Activity>
<Fragment>
<View Pager>
<Fragment>
<RecyclerView />
</Fragment>
</View Pager>
</Fragment>
</Activity>
Nach ein paar Stunden Debugging kann ich immer noch keine Ursache für ein solches Problem finden.
Vielen Dank.
Ich hatte versucht, RecyclerView
zu ändern
von
<Android.support.v7.widget.RecyclerView
Android:id="@+id/recycler_view"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
zu
<Android.support.v7.widget.RecyclerView
Android:id="@+id/recycler_view"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Es sieht anfangs gut aus. Beim Scrollen funktioniert das jedoch nicht wie erwartet: https://www.youtube.com/watch?v=U2EChFn6WkI
Ist ein Fehler an meiner Seite! Da ich für das letzte Zeilenelement einen anderen Rand haben muss, ist hier mein Adaptercode.
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
final List<TransactionSummary> transactionSummaries = buyArray.transactionSummaries;
if (position == transactionSummaries.size() - 1) {
holder.itemView.setLayoutParams(lastLayoutParams);
} else {
holder.itemView.setLayoutParams(normalLayoutParams);
}
Leider werden lastLayoutParams
und normalLayoutParams
als initialisiert
normalLayoutParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT
);
lastLayoutParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT
);
Lösen Sie das Problem mit LinearLayout.LayoutParams.WRAP_CONTENT
.
Es scheint, dass Sie LayoutParam
für Ihr View
in Ihrem Adapter
aktualisieren.
Dies ist möglich, da Ihre Benutzeroberfläche bis zum Beginn des Bildlaufs absolut in Ordnung ist. Dies bedeutet, dass Ihr XML korrekt ist, wie es in Ihrer XML-Layoutdatei definiert ist.
Die Tatsache, dass sie sich nach Beginn des Bildlaufs ändert, bedeutet, dass in Ihrer onBindViewHolder
-Implementierung ein logischer Fehler vorliegt. Aus diesem Grund wird der Fehler angezeigt, wenn Sie einen Bildlauf nach unten durchführen. Der Fehler bleibt dann bestehen, wenn Sie einen Bildlauf nach oben durchführen.
Ihr Problem ist, dass Ihr Teiler Schurke geworden ist:
<View
Android:layout_width="1px"
Android:layout_height="match_parent"
Android:background="?attr/buyPortfolioSeperatorBackground"
Android:layout_marginRight="5dp"
Android:layout_marginLeft="5dp" />
Stellen Sie es zu Testzwecken auf:
<View
Android:layout_width="1px"
Android:layout_height="30dp"
Android:background="?attr/buyPortfolioSeperatorBackground"
Android:layout_marginRight="5dp"
Android:layout_marginLeft="5dp" />
Stellen Sie sicher, dass Sie beide ändern!
Ich hatte ein ähnliches Problem. Letztendlich war der Recycler nicht das Problem. Überprüfen Sie, ob Ihre CardView-Artikelmaße in etwa so aussehen:
<Android.support.v7.widget.CardView
xmlns:card_view="http://schemas.Android.com/apk/res-auto"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
...
/>
Wenn Sie CardView nicht verwenden, stellen Sie sicher, dass das Element, das Sie in Ihrem Adapter für die Ansicht verwenden, Android:layout_height="wrap_content"
und nicht match_parent
.
Wenn dies nicht funktioniert, können Sie ein weiteres Attribut hinzufügen, indem Sie minHeight
oder maxHeight
für das Ansichtselement festlegen.
Die gute Nachricht:
Ich kann Sie genau auf die Version hinweisen, die das Verhalten von RecyclerView geändert hat: Es handelt sich nicht um eine Änderung in 23.2.1, sondern um eine Änderung in 23.2.0 (Februar 2016) . Genauer:
RecyclerView.LayoutManager ignoriert einige RecyclerView.LayoutParams-Einstellungen wie MATCH_PARENT in Bildlaufrichtung nicht mehr.
Hinweis: Diese aufgehobenen Einschränkungen können zu unerwartetem Verhalten in Ihren Layouts führen. Stellen Sie sicher, dass Sie die richtigen Layoutparameter angeben.
Wenn Sie die 23.2.0-Bibliotheken starten, sehen Sie in der Tat dasselbe Verhalten. Dieses Verhalten kann in Ihrem Fall vereinfacht werden als:
Wenn Sie nun die untergeordneten Elemente von RecyclerView mit Android:layout_x="match_parent"
Haben, wirkt sich dies auf die Android:layout_x
Von RecyclerView aus, was in 23.1.1 und früheren Versionen nicht der Fall war.
Die schlechte Nachricht:
Auch wenn ich zu 99% sicher bin, dass dies der Grund für Ihr Problem ist, kann ich in Ihrem Code immer noch kein Problem erkennen. Ich habe tatsächlich eine RecyclerView mit Ihrer XML-Struktur (Änderung nur der Farb-/Hintergrundparameter) mit einem LinearLayoutManager eingerichtet und sie funktioniert wie in 23.2.1 erwartet. Ich kann meine Implementierung freigeben, wenn Sie eine Überprüfung der Integrität durchführen möchten.
Sie sollten Ihre Adapterimplementierung/-manipulation überprüfen, auch wenn sie weit verbreitet ist.
Um diesen Fehler zu beheben, sollte row_layout height fixed oder wrap_content haben! Ich hatte auch dieses Problem und stellte nur fest, dass die Höhe von row_layout match_parent war.
Die Höhe der Recycling-Ansicht darf nur "wrap_content" sein. Die Papierkorbansicht behandelt die Höhe, wenn die Größe der Zelle zunimmt.
buy_portfolio_fragment.xml
<Android.support.v7.widget.RecyclerView
Android:id="@+id/recycler_view"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:background="?attr/buyPortfolioListViewBackground"
Android:requiresFadingEdge="none"
Android:scrollbars="vertical"
Android:paddingTop="@dimen/default_tab_layout_height"
Android:clipToPadding="false" />
Ich glaube, das ist die problematische Linie:
<View Android:layout_width="1px"
Android:layout_height="match_parent" <!--change this to wrap_content-->
Android:background="?attr/buyPortfolioSeperatorBackground"
Android:layout_marginRight="5dp"
Android:layout_marginLeft="5dp" />
In Ihrem Layout-Objekt befinden sich 2 Stellen mit layout_height = "match_parent". Sie sollten beide in wrap_content ändern.
Mach einfach row_layout
Höhe bis wrap_content
Es wird also nur Platz für die tatsächliche Zeilenhöhe für alle Elemente benötigt.