2012-10-12 19 views
6

W mojej aplikacji mam lewy panel, który zawiera widok listy. Wybór dokonany w tym widoku listy powoduje wywołanie odpowiednich danych, które aktualizują prawy panel oraz inne łącza i elementy w działaniu. Z tego powodu, lewy panel musi zawsze mieć dokonany wybór, aby pozostałe wartości były przydatne.Android: ustawianie programowo klikanego elementu listy do wybranego stanu.

W metodzie onCreate mojej aktywności wywołuję następujące opcje, aby domyślnie wybrać pierwszy element na liście. (ProgramList jest mój ListView)

programList.performItemClick(programList, 0, programList.getItemIdAtPosition(0); 

To wszystko działa świetnie i zobacz jak oczekiwano ładunki z odpowiednimi wartościami, z wyjątkiem jednej rzeczy.

Dodałem selektor do rysowania dla widoku listy, który wyróżnia wybrany element. Kiedy przedmiot zostanie fizycznie kliknięty w emulatorze, podświetli się (używam CHOICE_MODE_SINGLE), ale nie podświetla się po wywołaniu performItemClick(). Rozejrzałem się po pomoc w stackoverflow i próbowałem użyć poniższych przed kliknięciem, ale to nie miało znaczenia.

programList.requestFocusFromTouch(); 
    programList.setSelection(0); 

Od czytania API Brzmi jak metoda setSelection nie ustawia stan elementu pod dotykowym interfejsem, a od moich wyników wydaje się, że metoda performItemClick albo nie. Próbowałem również użyć

programList.getAdapter().getView(0, null, null).setSelected(true); 

Wtedy mogę odczytać stan widoku tekstu i zobaczyć, że jest wybrany, ale to też nie zrobił nic, aby zmienić to, co jest wyświetlane na ekranie.

Czy jest coś w metodzie onCreateMethod, która uniemożliwia inny sposób rysowania przycisku? Próbowałem unieważnić losowanie wewnątrz indywidualnego widoku tekstowego i unieważnić sam tekst, ale to nie pomogło. Próbowałem także zmienić tło widoku tekstu, ale wydaje się, że ustawiony przeze mnie selektor rządzi lub jest rysowany z przodu. Wiem, że mam poprawny textView, ponieważ użyłem getText do odczytania tego, co jest w środku.

Jeśli ktoś może mi pomóc w rozwiązaniu tego problemu lub skierować mnie na rozwiązanie, byłoby to bardzo cenne.

Odpowiedz

4

Podstęp polega na zastąpieniu metody adaptera przez getView(). Wypróbuj to:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    final View renderer = super.getView(position, convertView, parent); 
    if (position == index_of_selected_item) { 
     renderer.setBackgroundResource(android.R.color.darker_gray); 
    } 
    return renderer; 
} 

Oczywiście możesz ustawić kolor tła na dowolny kolor, który wskaże, że jest to "aktywny" element.

+0

Dzięki. Czy istnieje sposób, aby to działało za pomocą metody listview.setSelector(), lub będę musiał ustawić resztę moich stanów za pomocą getView() SetSelector jest znacznie bardziej wygodne, ponieważ jest tylko zasobem xml. Chciałbym wiedzieć, co dzieje się inaczej, gdy klikam myszką w emulatorze, a to, co się dzieje, gdy programowo wywołuję zdarzenie click. – ndw

+0

To nie pozwala mi odznaczać elementu, nawet jeśli dodaję do niego inne zdanie i ustawię na inny kolor. Widok Pobierz jest wywoływany tylko początkowo po załadowaniu widoku. Po ustawieniu tła dla tego elementu widoku listy pozostanie ono w ten sposób. [this] (http://stackoverflow.com/questions/10296846/android-listview-select-first-item-after-loading-datas) zdobyło mnie najbliżej, ale jego wyjaśnienie jest niepełne. – ndw

+2

Jak mogę uzyskać wartość index_of_selected_item – Dimitri