2015-04-20 18 views
15

Załaduję listę kategorii iw zależności od tego, która jest wybrana, muszę pokazać produkty z odpowiedniej kategorii w RecyclerView. Tak więc po pierwszym uruchomieniu Fragment muszę zasymulować kliknięcie przez użytkownika w domyślnej kategorii - w tym przypadku byłaby to pierwsza.Kliknięcie elementu programowo w RecyclerView

Jak mogę to wykonać?

Dziękuję bardzo z góry.

Odpowiedz

16

Bez Twojego kodu nie wiemy, w jaki sposób możesz wdrożyć swój onClickListener.

Zazwyczaj implementujesz i ustawiasz element onClickListener w widoku HOLDER swojego RecyclerView.Adapter.
Na przykład: ViewHolder.itemView.setOnClickListener(listener);

Więc roztwór można wykorzystać recyclerView.findViewHolderForAdapterPosition(0).itemView.performClick()

PS: Nie używaj findViewHolderForLayoutPosition() według Doc

9

o to obejście, aby wybrać 1st dziecko recyclerview po prostu ustawienie adaptera , mam nadzieję, że to pomoże Ci

//position to be clicked 
final int pos = 0; 
new Handler().postDelayed(new Runnable() { 
        @Override 
        public void run() { 
recyclerView.findViewHolderForAdapterPosition(pos).itemView.performClick(); 
        } 
       },1); 

cieszyć :)

+1

Dlaczego sugerują użycie obsługi tutaj? – Gaket

+1

Opóźnienie o 1 ms dla zdarzenia kliknięcia, ponieważ czasami powodowało to wyjątek wskaźnika pustego. – Saurabh

+0

Ten chłopiec ma rację ... rozwiązany wyjątek wskaźnika pustego –

0

To jest mile widziana przez purystów użyć metody

recyclerView.findViewHolderForAdapterPosition(pos).itemView.performClick(); 

jak stwierdza w docs:

Return the ViewHolder for the item in the given position of the data set. Unlike 
* {@link #findViewHolderForLayoutPosition(int)} this method takes into account any pending 
* adapter changes that may not be reflected to the layout yet. On the other hand, if 
* {@link Adapter#notifyDataSetChanged()} has been called but the new layout has not been 
* calculated yet, this method will return <code>null</code> since the new positions of views 
* are unknown until the layout is calculated. 

dokładnie dlatego, że opóźnienie w gwint jest czasami użyteczne. Każde wywołanie notifyDataSetChanged() powoduje, że zwraca on wartość null. Lepiej użyć metody adaptera onBindViewHolder i sprawdzić pozycję 0. Dostosuj, jak skonfigurowałeś swój słuchacz, tutaj znajduje się przykład usual way utworzony w konstruktorze ViewHolder. Użyj zmiennej init, aby zapobiec jego nazywany jest ponownie:

@Override 
    public void onBindViewHolder(FooAdapter.ViewHolder viewHolder, int position) { 
    //code 
    ... 
    //do this last especially if you are using an animator 

    if(position == 0 && isInit) { 
     listener.onItemClick(viewHolder.itemView,0); 
     isInit =false; 

    } 
    } 
0

jeśli chcesz kliknąć konkretny widok wewnątrz rzędu w pozycji a następnie użyć

recyclerView.findViewHolderForAdapterPosition(pos).itemView.findViewById(R.id.view_id).performClick(); 
Powiązane problemy