Próbuję użyć a RecyclerView
jako poziomego ListView
. Próbuję wymyślić, jak wyróżnić wybrany element. Kiedy klikam na jeden z elementów, zostaje on zaznaczony i odpowiednio podświetlony, ale kiedy kliknę na inny, drugi zostaje podświetlony ze starszym.
Oto moja funkcja onClick:
@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;
}
Oto 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
źródło
źródło
Odpowiedzi:
Napisałem podstawową klasę adaptera, aby automatycznie obsługiwać wybór elementów za pomocą RecyclerView. Po prostu wyprowadź z niego swój adapter i użyj rysowalnych list stanów z state_selected, tak jak w przypadku widoku listy.
Mam tutaj post na blogu o tym, ale oto kod:
źródło
mRecyclerView
nie jest nigdzie zadeklarowany. Czy powinniśmy po prostu przekazać go jako parametr w konstruktorze i przechowywać go w polu?onRecyclerViewAttached
i zapisz tam w zmiennej składowej.TrackSelectionAdapter
klasę i użyć jej na mojej liście? Jak „wyprowadzić adapter z Twojej klasy”? Czy mógłbyś odpowiedzieć na moje pytanie? Utknąłem tak głęboko: stackoverflow.com/questions/29695811/…To bardzo prosty sposób na zrobienie tego.
Have a
private int selectedPos = RecyclerView.NO_POSITION;
in the RecyclerView Adapter class, and under onBindViewHolder method try:A w zdarzeniu OnClick zmodyfikuj:
Działa jak urok dla Navigtional Drawer i innych adapterów przedmiotów RecyclerView.
Uwaga: pamiętaj, aby użyć koloru tła w swoim układzie za pomocą selektora, takiego jak wyjaśniono w przypadku współpracy:
W przeciwnym razie setSelected (..) nic nie zrobi, przez co to rozwiązanie stanie się bezużyteczne.
źródło
<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
AKTUALIZACJA [26 lipca 2017 r.]:
mam nadzieję, że to pomoże.
źródło
Twoja implementacja prawdopodobnie zadziała, jeśli przewiniesz treść poza widok, a następnie z powrotem do widoku. Miałem podobny problem, kiedy trafiłem na twoje pytanie.
Poniższy fragment pliku działa dla mnie. Moja implementacja miała na celu wielokrotny wybór, ale wrzuciłem tam hack, aby wymusić pojedynczy wybór. (* 1)
Jak wspomniano w tym połączonym pytaniu , ustawianie detektorów dla viewHolders powinno być wykonywane w onCreateViewHolder. Zapomniałem o tym wcześniej wspomnieć.
źródło
Myślę, że znalazłem najlepszy samouczek dotyczący korzystania z RecyclerView ze wszystkimi podstawowymi funkcjami, których potrzebujemy (pojedynczy + multiselekcja, podświetlanie, tętnienie, klikanie i usuwanie w przypadku wielokrotnego wyboru itp.).
Oto jest -> http://enoent.fr/blog/2015/01/18/recyclerview-basics/
Na tej podstawie mogłem stworzyć bibliotekę „FlexibleAdapter”, która rozszerza SelectableAdapter. Myślę, że to musi leżeć w gestii Adaptera, właściwie nie musisz za każdym razem przepisywać podstawowych funkcjonalności Adaptera, niech zrobi to biblioteka, więc możesz po prostu ponownie użyć tej samej implementacji.
Ten adapter jest bardzo szybki, działa od razu po wyjęciu z pudełka (nie trzeba go przedłużać); dostosowujesz elementy do każdego potrzebnego typu widoku; ViewHolder są predefiniowane: zaimplementowano już typowe zdarzenia: pojedyncze i długie kliknięcie; utrzymuje stan po rotacji i wiele więcej .
Zapraszamy do obejrzenia i wdrożenia go w swoich projektach.
https://github.com/davideas/F flexibleAdapter
Dostępna jest również Wiki.
źródło
Spójrz na moje rozwiązanie. Przypuszczam, że powinieneś ustawić wybraną pozycję w uchwycie i przekazać ją jako Tag of View. Widok należy ustawić w metodzie onCreateViewHolder (...). Istnieje również prawidłowe miejsce do ustawienia odbiornika dla widoku, takie jak OnClickListener lub LongClickListener.
Proszę spojrzeć na poniższy przykład i przeczytać komentarze do kodu.
źródło
nie ma selektora w RecyclerView, takiego jak ListView i GridView, ale spróbuj poniżej tego, co zadziałało dla mnie
utwórz selektor do rysowania, jak poniżej
następnie ustaw to do rysowania jako tło układu wierszy RecyclerView jako
źródło
Decyzja z interfejsami i wywołaniami zwrotnymi. Utwórz interfejs ze stanami zaznaczania i usuwania zaznaczenia:
Zaimplementuj interfejs w ViewHolder:
Uruchom zmianę stanu przy oddzwanianiu:
Utwórz RecyclerView z wywołaniem zwrotnym (przykład):
Zobacz więcej w artykule iPaulPro: https://medium.com/@ipaulpro/drag-and-swipe-with-recyclerview-6a6f0c422efd#.6gh29uaaz
źródło
to jest moje rozwiązanie, możesz ustawić na elemencie (lub grupie) i odznaczyć go kolejnym kliknięciem:
źródło
Miałem ten sam problem i rozwiązuję go w następujący sposób:
Plik xml, który jest używany do tworzenia wiersza wewnątrz createViewholder, po prostu dodaj poniższy wiersz:
LUB Jeśli używasz frameLayout jako elementu nadrzędnego elementu wiersza, to:
W kodzie java wewnątrz uchwytu widoku, w którym dodano odbiornik kliknięć:
źródło
Nie mogłem znaleźć w sieci dobrego rozwiązania tego problemu i rozwiązałem go samodzielnie. Wiele osób cierpi na ten problem. Dlatego chcę udostępnić tutaj moje rozwiązanie.
Podczas przewijania wiersze są poddawane recyklingowi. Dlatego zaznaczone pola wyboru i wyróżnione wiersze nie działają poprawnie. Rozwiązałem ten problem, pisząc poniższą klasę adaptera.
Realizuję również pełny projekt. W tym projekcie możesz zaznaczyć wiele pól wyboru. Wiersze zawierające zaznaczone pola wyboru są podświetlone. Co ważniejsze, nie są one tracone podczas przewijania. Możesz go pobrać z linku:
https://www.dropbox.com/s/ssm58w62gw32i29/recyclerView_checkbox_highlight.zip?dl=0
Zrzuty ekranu aplikacji:
źródło
Ustaw,
private int selected_position = -1;
aby zapobiec wybraniu dowolnego elementu na początku.źródło
Samo dodawanie
android:background="?attr/selectableItemBackgroundBorderless"
powinno działać, jeśli nie masz koloru tła, ale nie zapomnij użyć metody setSelected. Jeśli masz inny kolor tła, właśnie tego użyłem (używam wiązania danych);Ustaw funkcję isSelected at onClick
I dodaj to do xml;
źródło
Wybierz selektor:
Ustaw go jako tło w układzie elementu listy
W swoim adapterze dodaj OnClickListener do widoku (metoda onBind)
W zdarzeniu onClick aktywuj widok:
źródło