0

Ich möchte Layout-Präsentation in RecyclerView von Liste zu Grid und umgekehrt ändern. So habe ich änderte meine onCreateViewHolder Methode:Android Layout ändern Präsentation in RecyclerView

if (presentation.equals("grid")) { 
    return LayoutInflater.from(parent.getContext()).inflate(R.layout.view_item_grid, parent, false); 
} 
else { 
    return LayoutInflater.from(parent.getContext()).inflate(R.layout.view_item_list, parent, false); 
} 

In meiner Funktion Methode, habe ich verschiedene LayoutManager in .setLayoutManager(..) Methode dann notifyDataSetChanged();

if (presentation.equals("grid")) { 
    recyclerView.setLayoutManager(new GridLayoutManager(context, 3)); 
} 
else { 
    recyclerView.setLayoutManager(new LinearLayoutManager(context)); 
} 
adapter.notifyDataSetChanged(); 

Aber wenn ich diese Funktion verwenden, einige der Layouts von Rasterlayout und einige aus Listenlayout.

Ich weiß, dass RecyclerView Elemente wiederverwenden, wenn sie nicht gezeigt werden, aber wie man dies richtig zeigt und noch Elemente wiederverwenden?

+0

zeigen Sie Ihren Code, wo Sie Ihren 'LayoutManager' ändern .. !! –

+0

Nicht wirklich zu Ihrer Frage verwandt, aber Sie sollten auch erwägen, 'Präsentation' nicht als' String' zu speichern, sondern entweder als 'enum' (was Ihnen Typensicherheit geben würde) oder als' int' Felder mit vordefiniertem 'int' Konstanten für Werte (die Ihnen eine bessere Leistung bringen würden, wenn Sie nicht an #enumsmatter glauben). –

+0

Es ist eine komplexe Schnittstelle, aber ich wollte Sie nicht so für den Zweck dieses Beitrags ich änderte es in einfache Zeichenfolge und IFs zu verwechseln – Lau

Antwort

1

onCreateViewHolder() wird nur aufgerufen, wenn RecyclerView nicht genügend Ansichtshalter hat und Sie einen neuen erstellen müssen. Aber es wird einen Pool von zuvor erstellten View Holdern behalten und sie wiederverwenden. Wenn Sie Ihre Präsentation in "Raster" ändern, erstellen Sie neue "Rasteransichtshalter", aber die alten "Listenansichtshalter" befinden sich immer noch im Pool und werden wiederverwendet. Sie brauchen einen Weg, auf dem sich Ihre View-Inhaber nicht vermischen können. Ich kann ein paar Lösungen sehen.

Man würde auch den Ansichtstyp ändern. Normalerweise wird es verwendet, um mehr als einen Ansichtstyp gleichzeitig anzuzeigen (zum Beispiel kleine und große Gegenstände mischen). In Ihrem Fall kehren Sie immer noch die gleiche Ansicht Typ für jedes Element, aber es auf Ihrem presentation Variable so abhängig zu machen:

@Override 
public int getItemViewType(int position) { 
    return presentation.equals("grid") ? 0 : 1; 
} 

Eine andere Möglichkeit, zwei RecyclerView s in Ihrem Layout zu haben wäre. Beide könnten den gleichen Adapter verwenden. Man würde nur Rasteransichthalter erstellen, die anderen nur Listenansichtshalter. Dann könntest du sie entsprechend zeigen und verstecken.