web-dev-qa-db-de.com

Element "Recycler-Ansicht" füllt die gesamte Höhe der Recycler-Ansicht nach dem Upgrade der Unterstützungsbibliothek von "23.1.1" auf "23.2.1" aus

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

enter image description here

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.

enter image description here

enter image description here

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.

  • Fehler im Zusammenhang mit verschiedenen Messmethoden wurden behoben. (Problem 201856)
  • Der Sperrzeitraum, in dem RecyclerView beim Berechnen eines Layouts oder Bildlaufs keine Adapteränderungen zulässt, wurde verringert. (Problem 202046)
  • Ein Absturz beim Aufrufen von notifyItemChanged() für ein Element, das nicht sichtbar ist, wurde behoben. (Problem 202136)
  • Es wurde ein Absturz behoben, der auftrat, wenn 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.

Was ich versucht hatte

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

UPDATE: Ich finde endlich die Ursache heraus

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.

44
Cheok Yan Cheng

Aktualisieren

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.

Alte Antwort

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!

17
Knossos

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.

10
Patrick W

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.

8
Sevle

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.

4
Liridon Sadiku

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" />
3

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.

2
Tiago

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.

1
Abhishek Kumar