Ich versuche ein RecyclerView
als Horizontale zu verwenden ListView
. Ich versuche herauszufinden, wie das ausgewählte Element hervorgehoben werden kann. Wenn ich auf eines der Elemente klicke, wird es ausgewählt und richtig hervorgehoben. Wenn ich jedoch auf ein anderes klicke, wird das zweite mit dem älteren hervorgehoben.
Hier ist meine onClick-Funktion:
@Override
public void onClick(View view) {
if(selectedListItem!=null){
Log.d(TAG, "selectedListItem " + getPosition() + " " + item);
selectedListItem.setBackgroundColor(Color.RED);
}
Log.d(TAG, "onClick " + getPosition() + " " + item);
viewHolderListener.onIndexChanged(getPosition());
selectedPosition = getPosition();
view.setBackgroundColor(Color.CYAN);
selectedListItem = view;
}
Hier ist das onBindViewHolder
:
@Override
public void onBindViewHolder(ViewHolder viewHolder, int position) {
viewHolder.setItem(fruitsData[position]);
if(selectedPosition == position)
viewHolder.itemView.setBackgroundColor(Color.CYAN);
else
viewHolder.itemView.setBackgroundColor(Color.RED);
}
android
android-recyclerview
recycler-adapter
user65721
quelle
quelle
Antworten:
Ich habe eine Basisadapterklasse geschrieben, um die Artikelauswahl automatisch mit einem RecyclerView durchzuführen. Leiten Sie einfach Ihren Adapter daraus ab und verwenden Sie mit state_selected zeichnbare Statuslisten, wie Sie es bei einer Listenansicht tun würden.
Ich habe einen Blog-Beitrag hier darüber, aber hier ist der Code:
quelle
mRecyclerView
wird nirgendwo deklariert. Sollten wir es einfach als Parameter im Konstruktor übergeben und in einem Feld speichern?onRecyclerViewAttached
und speichern Sie es dort in einer Mitgliedsvariablen.TrackSelectionAdapter
Klasse importieren und in meiner Liste verwenden muss? Wie leite ich "meinen Adapter von Ihrer Klasse ab"? Könnten Sie bitte meine Frage beantworten? Ich stecke so tief fest: stackoverflow.com/questions/29695811/…Dies ist eine sehr einfache Möglichkeit.
Haben Sie eine
private int selectedPos = RecyclerView.NO_POSITION;
in der RecyclerView Adapter-Klasse und versuchen Sie unter onBindViewHolder-Methode:Und in Ihrem OnClick-Ereignis ändern Sie:
Funktioniert wie ein Zauber für Navigtional Drawer und andere RecyclerView Item Adapter.
Hinweis: Verwenden Sie in Ihrem Layout unbedingt eine Hintergrundfarbe, indem Sie einen Selektor wie Colabug verwenden.
Andernfalls führt setSelected (..) nichts aus und macht diese Lösung unbrauchbar.
quelle
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@color/pressed_color" android:state_pressed="true"/> <item android:drawable="@color/selected_color" android:state_selected="true"/> <item android:drawable="@color/focused_color" android:state_focused="true"/> </selector>
vieHolder.getLayoutPosition
UPDATE [26 / Jul / 2017]:
hoffe das wird helfen.
quelle
Ihre Implementierung funktioniert wahrscheinlich, wenn Sie den Inhalt aus der Ansicht und dann wieder in die Ansicht scrollen. Ich hatte ein ähnliches Problem, als ich auf Ihre Frage stieß.
Das folgende Datei-Snippet funktioniert für mich. Meine Implementierung war auf Mehrfachauswahl ausgerichtet, aber ich habe dort einen Hack ausgeführt, um eine Einzelauswahl zu erzwingen. (* 1)
Wie in dieser verknüpften Frage erwähnt , sollte das Festlegen von Listenern für viewHolders in onCreateViewHolder erfolgen. Ich habe vergessen, dies zuvor zu erwähnen.
quelle
Ich denke, ich habe das beste Tutorial gefunden, wie man RecyclerView mit allen grundlegenden Funktionen verwendet, die wir benötigen (Einzel + Mehrfachauswahl, Hervorheben, Welligkeit, Klicken und Entfernen bei Mehrfachauswahl usw.).
Hier ist es -> http://enoent.fr/blog/2015/01/18/recyclerview-basics/
Auf dieser Grundlage konnte ich eine Bibliothek "FlexibleAdapter" erstellen, die einen SelectableAdapter erweitert. Ich denke, dies muss in der Verantwortung des Adapters liegen. Tatsächlich müssen Sie die grundlegenden Funktionen des Adapters nicht jedes Mal neu schreiben. Lassen Sie eine Bibliothek dies tun, damit Sie dieselbe Implementierung einfach wiederverwenden können.
Dieser Adapter ist sehr schnell und funktioniert sofort (Sie müssen ihn nicht erweitern). Sie passen die Elemente für jeden Ansichtstyp an, den Sie benötigen. ViewHolder sind vordefiniert: Allgemeine Ereignisse sind bereits implementiert: Einzel- und Langklick; es behält den Zustand nach der Rotation bei und vieles mehr .
Bitte schauen Sie sich das an und implementieren Sie es in Ihre Projekte.
https://github.com/davideas/FlexibleAdapter
Ein Wiki ist ebenfalls verfügbar.
quelle
Schau dir meine Lösung an. Ich nehme an, Sie sollten die ausgewählte Position im Halter festlegen und als Tag of View übergeben. Die Ansicht sollte in der Methode onCreateViewHolder (...) festgelegt werden. Es gibt auch den richtigen Ort, um den Listener für die Ansicht festzulegen, z. B. OnClickListener oder LongClickListener.
Bitte schauen Sie sich das folgende Beispiel an und lesen Sie die Kommentare zum Code.
quelle
In RecyclerView gibt es keinen Selektor wie ListView und GridView, aber Sie versuchen unten, was bei mir funktioniert hat
Erstellen Sie einen Selektor, der wie folgt gezeichnet werden kann
Legen Sie dieses Zeichen dann als Hintergrund für Ihr RecyclerView-Zeilenlayout fest
quelle
Entscheidung mit Schnittstellen und Rückrufen. Schnittstelle mit ausgewählten und nicht ausgewählten Zuständen erstellen:
Schnittstelle in ViewHolder implementieren:
Statusänderung beim Rückruf ausführen:
Erstellen Sie RecyclerView mit Rückruf (Beispiel):
Weitere Informationen finden Sie im Artikel von iPaulPro: https://medium.com/@ipaulpro/drag-and-swipe-with-recyclerview-6a6f0c422efd#.6gh29uaaz
quelle
Dies ist meine Lösung. Sie können ein Element (oder eine Gruppe) festlegen und die Auswahl mit einem weiteren Klick aufheben:
quelle
Ich hatte das gleiche Problem und löse es folgendermaßen:
Die XML-Datei, die zum Erstellen einer Zeile in createViewholder verwendet wird, fügen Sie einfach die folgende Zeile hinzu:
ODER Wenn Sie frameLayout als übergeordnetes Element des Zeilenelements verwenden, gilt Folgendes:
Im Java-Code im Ansichtshalter, den Sie beim Klicken auf den Listener hinzugefügt haben:
quelle
Ich konnte im Web keine gute Lösung für dieses Problem finden und habe es selbst gelöst. Es gibt viele Menschen, die unter diesem Problem leiden. Daher möchte ich meine Lösung hier teilen.
Während des Bildlaufs werden Zeilen recycelt. Daher funktionieren aktivierte Kontrollkästchen und hervorgehobene Zeilen nicht ordnungsgemäß. Ich habe dieses Problem gelöst, indem ich die folgende Adapterklasse geschrieben habe.
Ich implementiere auch ein vollständiges Projekt. In diesem Projekt können Sie mehrere Kontrollkästchen aktivieren. Zeilen mit ausgewählten Kontrollkästchen werden hervorgehoben. Und was noch wichtiger ist, diese gehen beim Scrollen nicht verloren. Sie können es über den Link herunterladen:
https://www.dropbox.com/s/ssm58w62gw32i29/recyclerView_checkbox_highlight.zip?dl=0
Screenshots der App:
quelle
Festlegen
private int selected_position = -1;
, um zu verhindern, dass beim Start ein Element ausgewählt wird.quelle
Das Hinzufügen
android:background="?attr/selectableItemBackgroundBorderless"
sollte funktionieren, wenn Sie keine Hintergrundfarbe haben, aber vergessen Sie nicht, die setSelected-Methode zu verwenden. Wenn Sie eine andere Hintergrundfarbe haben, habe ich diese gerade verwendet (ich verwende Datenbindung).Set isSelected bei der onClick-Funktion
Und füge dies zu xml hinzu;
quelle
Auswahl treffen:
Legen Sie es als Hintergrund für Ihr Listenelementlayout fest
Fügen Sie in Ihrem Adapter OnClickListener zur Ansicht hinzu (onBind-Methode)
Aktivieren Sie im Ereignis onClick die Ansicht:
quelle