2013-01-02 18 views
9

Utworzyłem ListFragment stosując następujący układ niestandardowy która dodaje TextView aby wyświetlić wiadomość, gdy lista jest pusta:ListView pokazuje pustą wiadomość na krótko zanim dane zostaną załadowane

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <ListView android:id="@id/android:list" 
      android:layout_width="match_parent" 
      android:layout_height="0dp" 
      android:layout_weight="1" 
      android:drawSelectorOnTop="false"/> 

    <TextView android:id="@id/android:empty" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:text="@string/vsl_empty" 
      android:gravity="center" 
      android:layout_gravity="center" 
      android:textColor="#8C8C8C" /> 
</LinearLayout> 

Dane są ładowane przy użyciu niestandardowy adapter, który pochodzi z CursorAdapter. Gdy w bazie danych znajdują się dane, lista bardzo krótko pokazuje komunikat pustej listy, dopóki dane nie zostaną załadowane, w którym to momencie lista zostanie zapełniona.

W jaki sposób mogę zapobiec krótkiemu pojawianiu się pustej listy, ponieważ lista nie została jeszcze wypełniona?

Aktualizacja

Chcę podkreślić, że używam ListFragment z układem, który zawiera ListView ze specjalnym identyfikatorem android:list oraz TextView ze specjalnym identyfikatorem android:empty, jak wyjaśniono here.

Ustawienie android:visibility="invisible" nie wpływa na widoczność. Podejrzewam, że dzieje się tak dlatego, że ustawienie jest widoczne wewnętrznie.

+0

Czy używasz 'Loader's? –

+0

Tak. Tworzę adapter z 'null' dla argumentu kursora, ustawiam adapter na' ListView', a następnie uruchamiam program ładujący. LoaderManager.LoaderCallbacks zajmują się tworzeniem kursora. – Jon

Odpowiedz

1

Jak o dodanie następujących do TextView

android:visibility="invisible" 

do pliku XML szablonu, a następnie dokonywania TextView widoczny w razie potrzeby.

+1

Ustawienie 'TextView' na' niewidoczny' nie różni się. – Jon

-1

Będziesz musiał ustawić TextViewwidoczność do niewidoczny, a dopiero po załadowaniu danych --that jest onLoadComplete - trzeba będzie ustawić go jako pusty Zobacz na ListView wykonując setEmptyView(textView) ;

Jeśli zrobisz to w XML lub zrobisz to przed załadowaniem wyników, widok zostanie wyświetlony, ponieważ lista jest faktycznie pusta. Musisz więc poczekać, aż wyniki zostaną załadowane, aby ustawić pusty widok.

+0

Jak ustawić 'TextView' na niewidoczny? W XML, używając id 'android: empty', ustawienie go na niewidoczny nie działa. Zgaduję, że jest przesłonięta, ponieważ id ma specjalne znaczenie. Co jest bardzo dziwne, jeśli na końcu 'onActivityCreated()' ja nazywam 'setEmptyView (null);' ListView znika i ** tylko ** pusty widok jest pokazany! – Jon

8

Podane odpowiedzi były na właściwej ścieżce. I rzeczywiście miał ustawić TextView się niewidzialny, ale prawidłowa lokalizacja jest w onCreateLoader:

@Override 
public Loader<Cursor> onCreateLoader(int id, Bundle args) 
{ 
    mListView.getEmptyView().setVisibility(ListView.GONE); 

    return new CursorLoader(getActivity(), CONTENT_URI, null, null, null, null); 
} 

Ponadto, nie jest konieczne, aby pusty Zobacz ponownie widoczne: odbywa się to automatycznie przez ramy.

+1

Dzięki temu zadziałało. Musiałem uczynić pusty widok widocznym ponownie przy użyciu ListView.VISIBLE –

+0

Nie powinieneś potrzebować, aby LISTA była niewidoczna (użyj ViewSwitcher) na przykład. –