Ändern der Spaltenanzahl mit GridLayoutManager und RecyclerView

Lesezeit: 5 Minuten

In meinem Fragment stelle ich mein GridLayout folgendermaßen ein:
mRecycler.setLayoutManager(new GridLayoutManager(rootView.getContext(), 2));

Also, ich möchte das einfach ändern 2 Für ein 4 wenn der Benutzer das Telefon/Tablet dreht. Ich habe darüber gelesen onConfigurationChanged und ich habe versucht, es für meinen Fall zum Laufen zu bringen, aber es geht nicht in die richtige Richtung. Wenn ich mein Handy drehe, stürzt die App ab…

Können Sie mir sagen, wie ich dieses Problem lösen kann?

Hier ist mein Ansatz, um die Lösung zu finden, die nicht richtig funktioniert:

  @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);

        int orientation = newConfig.orientation;

        if (orientation == Configuration.ORIENTATION_PORTRAIT) {
            mRecycler.setLayoutManager(new GridLayoutManager(mContext, 2));
        } else if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
            mRecycler.setLayoutManager(new GridLayoutManager(mContext, 4));
        }
    }

Danke im Voraus!

  • Bitte Crashlog hinzufügen

    – Bojan Kseneman

    11. April 2015 um 17:00 Uhr

  • Ich habe gerade einen Blick auf mein Logcat geworfen und das hat den Absturz nicht verursacht. Aber es funktioniert immer noch nicht.

    – faps

    11. April 2015 um 17:57 Uhr

  • Ich würde keinen neuen Manager erstellen, sondern einen vorhandenen verwenden. Verwenden Sie getLayoutManager() in Ihrem Recyclerview und wandeln Sie es in GridLayoutManager um. Rufen Sie auf diesem Manager setSpanCount(orientation == portrait ? 2 : 4) auf und um die Ansicht neu zu zeichnen, rufen Sie adaper.notifyDatasetChanged() auf. Dies sollte gut funktionieren, wenn Ihre Ansicht nicht jedes Mal neu gezeichnet wird.

    – Bojan Kseneman

    11. April 2015 um 21:37 Uhr


  • BEEINDRUCKEND! Das klingt, als hätte ich gesucht, aber ich wusste nicht, wie ich es erreichen sollte. Ich probiere es aus und erzähle davon.

    – faps

    11. April 2015 um 21:57 Uhr

  • Beachten Sie, dass es immer eine gute Idee ist, die Ausrichtung beim Erstellen der Ansicht selbst zu überprüfen. Das tun Sie normalerweise in onCreate für Aktivitäten oder onCreateView für Fragmente. Stellen Sie sicher, dass Sie dies tun, da Ihre Benutzer die Aktivität möglicherweise im Querformat starten

    – Bojan Kseneman

    11. April 2015 um 22:52 Uhr

Benutzer-Avatar
TWiStErRob

Wenn Sie mehr als eine Bedingung haben oder den Wert an mehreren Stellen verwenden, kann dies ziemlich schnell außer Kontrolle geraten. Ich schlage vor, folgende Struktur zu erstellen:

res
  - values
    - dimens.xml
  - values-land
    - dimens.xml

mit res/values/dimens.xml Sein:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer name="gallery_columns">2</integer>
</resources>

und res/values-land/dimens.xml Sein:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer name="gallery_columns">4</integer>
</resources>

Und der Code wird dann (und bleibt für immer) so:

final int columns = getResources().getInteger(R.integer.gallery_columns);
mRecycler.setLayoutManager(new GridLayoutManager(mContext, columns));

Sie können leicht erkennen, wie einfach es ist, neue Möglichkeiten zur Bestimmung der Spaltenanzahl hinzuzufügen, z. B. mit -w500dp/-w600dp/-w700dp Ressourcenordner statt -land.

Es ist auch ganz einfach, diese Ordner in separaten Ressourcenordnern zu gruppieren, falls Sie Ihre anderen (relevanteren) Ressourcen nicht überladen möchten:

android {
    sourceSets.main.res.srcDir 'src/main/res-overrides' // add alongside src/main/res
}

Benutzer-Avatar
SobaEntwickler

Versuchen Sie stattdessen, dies in Ihrer onCreateView-Methode zu handhaben, da sie jedes Mal aufgerufen wird, wenn sich die Ausrichtung ändert:

if(getActivity().getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT){
     mRecycler.setLayoutManager(new GridLayoutManager(mContext, 2));
}
else{
     mRecycler.setLayoutManager(new GridLayoutManager(mContext, 4));
}

  • Ich probiere es aus und erzähle davon. Vielen Dank!

    – faps

    11. April 2015 um 21:57 Uhr

  • Ist dies das richtige Verhalten für diese Aufgabe? Vielen Dank

    – ciccioska

    6. August 2015 um 14:42 Uhr

  • @ciccioska denke ich Ressourcenordner sind eine bessere Übung als das Ausführen von Bedingungen getConfiguration() oder onConfigurationChanged. Siehe auch meine Antwort zu dieser Frage.

    – TWiStErRob

    30. September 2015 um 23:28 Uhr

Neben den Antworten. Dies kann auch nur mit XML-Attributen erfolgen. Unten ist der Code.

<androidx.recyclerview.widget.RecyclerView
        android:id="@+id/pax_seat_map_rv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:spanCount="3"
        android:orientation="vertical"
        app:layoutManager="androidx.recyclerview.widget.GridLayoutManager" />

Die Recycle-Ansicht unterstützt AutofitRecycleView.

Sie müssen hinzufügen android:numColumns="auto_fit" in Ihrer XML-Datei.

Darauf können Sie sich beziehen AutofitRecycleViewLink

Benutzer-Avatar
Otieno Rowland

Eine robustere Methode zur Bestimmung der Nr. von Spalten wäre es, sie basierend auf der Bildschirmbreite und zur Laufzeit zu berechnen. Normalerweise verwende ich dafür die folgende Funktion.

public static int calculateNoOfColumns(Context context) {
    DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
    float dpWidth = displayMetrics.widthPixels / displayMetrics.density;
    int scalingFactor = 200; // You can vary the value held by the scalingFactor
    // variable. The smaller it is the more no. of columns you can display, and the
    // larger the value the less no. of columns will be calculated. It is the scaling
    // factor to tweak to your needs.
    int columnCount = (int) (dpWidth / scalingFactor);
    return (columnCount>=2?columnCount:2); // if column no. is less than 2, we still display 2 columns
}

Es ist eine dynamischere Methode, um die Nr. genau zu berechnen. von Spalten. Dies ist anpassungsfähiger für Benutzer mit unterschiedlichen Bildschirmgrößen, ohne auf nur zwei mögliche Werte beschränkt zu sein.

Hinweis: Sie können den Wert von ändern Vergößerungsfaktor, Verkleinerungsfaktor Variable. Je kleiner es ist, desto mehr nein. Spalten können Sie anzeigen, und je größer der Wert, desto weniger Anzahl. Spalten werden berechnet. Es ist der Skalierungsfaktor, der an Ihre Bedürfnisse angepasst werden kann.

Benutzer-Avatar
Wladimir Salguero

Im Ereignis onCreate () können Sie StaggeredGridLayoutManager verwenden

mRecyclerView = (RecyclerView) v.findViewById(R.id.recyclerView);      

mStaggeredGridLayoutManager = new StaggeredGridLayoutManager(
       1, //number of grid columns
       GridLayoutManager.VERTICAL);      

mRecyclerView.setLayoutManager(mStaggeredGridLayoutManager);

Wenn der Benutzer dann den Bildschirm dreht, erfassen Sie das Ereignis und ändern die Anzahl der Spalten automatisch

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    if (getActivity().getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {           
            mStaggeredGridLayoutManager.setSpanCount(1);

    } else {           
            //show in two columns
            mStaggeredGridLayoutManager.setSpanCount(2);           
    }
}

Benutzer-Avatar
Benutzer6731701

Am Ende habe ich dies in der onCreate-Methode behandelt.

private RecyclerView recyclerView = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
    recyclerView.setHasFixedSize(true);
    Configuration orientation = new Configuration();
    if(this.recyclerView.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
        recyclerView.setLayoutManager(new GridLayoutManager(this, 2));
    } else if (this.recyclerView.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
        recyclerView.setLayoutManager(new GridLayoutManager(this, 4));
    }
            connectGetApiData();
}

Für meine App hat es tadellos geklappt.

1226060cookie-checkÄndern der Spaltenanzahl mit GridLayoutManager und RecyclerView

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy