2010-10-28 8 views
13

Mam działanie podrzędne, które zawiera ListView. Ta aktywność jest asynchronicznie zapełniana kursorem SQLite. Elementy listy zawierają TextView, RadioButton i normalny Button. XML przedstawiono poniżej:Informacje o tym, kiedy zostanie utworzony listView systemu Android,

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout android:id="@+id/rlCategoryListItemLayout" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content"> 
<TextView android:id="@+id/tvCategoryListItemTitle" style="@style/uwLargeListItemLabelStyle" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_centerVertical="true" android:singleLine="true" android:text="This is a test note title" /> 
<LinearLayout android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="fill_parent" android:layout_alignParentRight="true" android:gravity="center_vertical"> 
    <RadioButton android:id="@+id/rdoCategoryListItemSelect" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginRight="10dip" /> 
    <Button android:id="@+id/btnCategoryListItemDelete" android:background="@drawable/delete_red" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" /> 
</LinearLayout> 
</RelativeLayout> 

muszę zrobić trochę logiki do określenia, które RadioButton jest domyślnie zaznaczona, a ja nie mogę tego zrobić, dopóki ListView jest już załadowany. Problem polega na tym, że przy wszystkich zdarzeniach, które wypróbowałem do tej pory (onCreate, onPostCreate, onResume, onWindowFocusChanged), liczba dzieci w ListView wynosi zero. Próbowałem również przy użyciu metody getView w klasie ArrayAdapter, ale ta metoda nazywa się często razy i liczba potomna ListView jest potencjalnie inna za każdym razem, prowadząc do nieoczekiwanych wyników. Najwyraźniej te zdarzenia są uruchamiane, zanim ListView zakończy się pełnym zapełnianiem elementów potomnych.

Czy jest jakieś wydarzenie, które mogę posłuchać, lub w inny sposób określić, kiedy ListView jest wypełniony i czy wszystkie jego dzieci są dostępne do modyfikacji programowo?

Dziękujemy!

Odpowiedz

1

ListView nie tworzy widoku dla każdego elementu na liście danych, które renderuje. Zamiast tego przetwarza widoki, aby być responsywnym, a nie pamięcią. Możesz ponownie przemyśleć to, czego naprawdę potrzebujesz, gdy powiesz, że ListView musi zostać wypełniony.

Może to pomóc, jeśli zajmiemy się trochę więcej szczegółami na temat Twojej aplikacji i opublikujemy kod.

+1

Dzięki, elewacja. Muszę tylko wybrać jeden z RadioButtons domyślnie. Kiedy jednak próbuję to zrobić, ListView nie ma jeszcze elementów potomnych. Muszę wiedzieć, kiedy ListView jest w pełni zapełniony, więc mogę wejść i wybrać jeden z elementów listy. – mahdaeng

+0

Moim celem jest to, co masz na myśli przez "ListView jest w pełni zaludniony" nie jest jasne. Jeśli przez to rozumiemy, że wszystkie elementy na liście są widoczne, to warunek ten nigdy nie może się zdarzyć z uwagi na sposób renderowania wierszy przez ListView. – elevine

+0

Tak - właśnie o to mi chodzi. :^( – mahdaeng

2

Po zakończeniu pracy asynchronicznej w bazie danych można użyć funkcji Handler.post (Runnable), aby uruchomić kod z powrotem w głównym wątku. Jest prawie jak wyzwalanie wywołania zwrotnego i możesz zagwarantować, że będzie działał po zapełnieniu listy. Możesz nawet zaplanować, by Runnable nastąpiło o określonej porze, jeśli zajdzie potrzeba dokładnego zmierzenia czasu.

Czy to było pomocne?

+0

Dziękuję, mtmurdock. Spróbuję tam trochę rzeczy i zobaczę, co mogę wymyślić. Złożę raport z moich wyników. – mahdaeng

+0

Inną opcją wzdłuż tych linii jest użycie AsyncTask: http: // developer .android.com/reference/android/os/AsyncTask.html – elevine

+0

Jak się okazało, miałem subtelny błąd w innym miejscu mojego kodu, najwyraźniej odpalałem mój Runnable dokładnie wtedy, kiedy powinienem był, ale drugi błąd był wydaje mi się, że niektóre kontrolki nie były jeszcze gotowe, dziękuję, mtmurdock i podwyższony, za twoją chęć pomocy w rozwiązaniu tego problemu – mahdaeng

0

Możesz dodać zmienną string w swojej działalności (np public static String END_LOAD) i ustawić wartość w swojej metodzie getView (w adapterze), a następnie w swojej działalności, po

ListView listView = (ListView) findViewById(R.id.recordListView); 
     listView.setAdapter(adapter); 

Możesz dodać prosty gwint że będzie sprawdzić zmienną END_LOAD:

Runnable runnable = new Runnable() { 
    @Override 
    public void run() { 
     while (END_LOAD == null || END_LOAD .equals("")) { // your conditions 
     } 
     createReadRequest(); // your task to execute 
    } 
}; 

new Thread(runnable).start(); 

dodać prosty warunek, który może być dla Ciebie interesujący, wówczas, gdy warunek będzie fałszywy dlatego, że metoda getView jest zrobione, teraz można zrobić swój specyficzny proces.

+0

Co to jest END_LOAD? I jak mogę to zdobyć? –

6

Można użyć Handler do wykonania tego zadania, na przykład:

W swojej aktywności dodać Handler jak każdy inny obiekt.

private Handler mListViewDidLoadHanlder = new Handler(new Handler.Callback() { 
    @Override 
    public boolean handleMessage(Message message) { 
     //Do whatever you need here the listview is loaded 
     return false; 
    } 
}); 

A wewnątrz metody getView adaptera listview zrobić porównanie, czy aktualna pozycja jest ostatni, więc będzie to zakończyć (wystarczy umieścić go przed powrotem):

public View getView(int position, View convertView, ViewGroup parent) { 
     //Your views logic here 

     if (position == mObjects.size() - 1) { 
       mViewDidLoadHanlder.sendEmptyMessage(0); 
      } 

     return convertView; 
    } 
+4

Rozmiar danych (mObjects) nie jest skorelowany z rzeczywistą liczbą wyświetlaną w getView. – AndroidDev

+0

Nie ma 'getView (' w moim 'ListView.java', gdzie dokładnie jest ta metoda? – msysmilu

+0

Masz rację, to jest w twoim adapterze http://developer.android.com/reference/android/widget/ArrayAdapter .html # getView (int, android.view.View, android.view.ViewGroup) –

Powiązane problemy