2012-11-28 20 views
20

Mam problemy podczas próby usunięcia nagłówka z listView. Na początku używam addHeaderView(), aby go dodać, ale gdy zmienię na inny układ, chcę, aby zniknął, ale removeHeaderView() nie działa ...Usuń nagłówek z listyView

Próbowałem również ustawić widoczność na GONE i nie zniknie ...

Co mogę zrobić?

góry dzięki

Odpowiedz

0

Jeśli używasz addHeaderView(), nie można usunąć nagłówek po tym.

Więc nie używaj addHeaderView(). Zamiast tego utwórz własny adapter, który łączy swój główny zestaw widoków z Twoim nagłówkiem. Podczas gdy moja MergeAdapter nie będzie obsługiwać konkretny przypadek, można użyć go zobaczyć koncepcji mieszania wielu źródeł rzędu:

https://github.com/commonsguy/cwac-merge

+0

można usunąć widok nagłówka jeśli masz zmienną, aby wskazywała header, zobacz ten link: http://stackoverflow.com/a/39286390/1817569 – Hamid

48

Spróbuj podejście wymienionych poniżej ..

Android ListView#addHeaderView i ListView#addFooterView metody są dziwne: musisz dodać widoki nagłówka i stopki, zanim ustawisz adapter ListView, aby ListView mógł uwzględnić nagłówki i stopki - w przeciwnym razie otrzymasz wyjątek. Tutaj dodamy ProgressBar (pokrętła) jako headerView:

// spinner jest ProgressBar

listView.addHeaderView(spinner); 

Chcielibyśmy, aby móc pokazać i ukryć ten spinner do woli, ale usunięcie go jest wręcz niebezpieczne, ponieważ nigdy nie być w stanie go dodać ponownie bez niszczenia ListView - pamiętać, że nie możemy po addHeaderView mamy to adapter:

listView.removeHeaderView(spinner); //dangerous! 

Więc go ukryć! Okazuje się, że to też jest trudne. Po prostu ukrycie samego widoku tarczy skutkuje pustym, ale wciąż widocznym obszarem nagłówka.

Teraz starają się ukryć tarczy:

spinner.setVisibility(View.GONE); 

Wynik: obszar nagłówka nadal widoczny z brzydkiego przestrzeni:

Rozwiązaniem jest umieszczenie postęp pasek w LinearLayout, który otacza zawartość i ukrywa zawartość.W ten sposób LinearLayout owijania załamie się, gdy jej treść jest ukryta, w wyniku headerView, technicznie nadal obecne, ale 0dip wysoka:

<LinearLayout 
     xmlns:a="http://schemas.android.com/apk/res/android" 
     android:orientation="vertical" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content"> 
    <!-- simplified --> 
     <ProgressBar 
     android:id="@+id/spinner" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"/> 
    </LinearLayout> 

Następnie wybrać układ jako nagłówek:

spinnerLayout = getLayoutInflater().inflate(R.layout.header_view_spinner, null); 
listView.addHeaderView(spinnerLayout); 

a kiedy trzeba go ukryć, ukryć zawartość układu, a nie układ:

spinnerLayout.findViewById(R.id.spinner).setVisibility(View.GONE); 

teraz nagłówek zniknie z pola widzenia. Nigdy więcej brzydkiej przestrzeni na górze!

+2

+1 fantastyczna - działa świetnie dla mnie – Dori

+0

Wielkiej Praca, świetny sposób na wyjaśnienie całego procesu. –

+0

Człowiek z dodatkowym kilogramem mózgu – Sayka

14

Większość ludzi nie lubi używać AddHeaderView, jednak czasami uważam, że jest to bardzo wygodne, aby uniknąć modyfikowania złożonych adapterów lub jeśli nagłówki nie są z nimi powiązane.

Z tego prostego triku będziesz mógł płynnie usunąć/dodać nagłówki:

dodam pusty LinearLayout z orientation vertical i wysokość wrap_content jako jedyny Widok z okna (niech mListView być celem listView) :

LinearLayout mCustomHeaders=new LinearLayout(context); 
mCustomHeaders.setOrientation(LinearLayout.VERTICAL); 

mListView.addHeaderView(mCustomHeaders); 
mListView.setAdapter (.......) 

Thenafter, mogę dodać losowe rzeczy, gdziekolwiek, na liście jako cel, nawet gdy lista jest pełna:

mCustomHeaders.add(myHeaderView1); 
mCustomHeaders.add(myHeaderView2); 
mCustomHeaders.add(myHeaderView3); 

Można również usunąć wszystkie nagłówki, w każdej chwili:

mCustomHeaders.removeAllViews(); // will erase all headers 

Masz pomysł .... Mam nadzieję, że to pomaga!

+0

To działało bardzo dobrze. –

1

Gdzie drawerLogoView jest mój headerview, oto co robię:

drawerLogoView = mInflater.inflate(R.layout.navigation_drawer_custom_layout, null); 
    mDrawerList.addHeaderView(drawerLogoView,null,false);     
    LinearLayout layOut = ((LinearLayout)drawerLogoView.findViewById(R.id.NavProfilePreviewLayout)); 
    layOut.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, 0)); 

ten sposób, staje się niewidoczny: D Aby pokazać go z powrotem, można użyć to:

LinearLayout layOut = ((LinearLayout)drawerLogoView.findViewById(R.id.NavProfilePreviewLayout)); 
    layOut.setLayoutParams(newRelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT)); 
0

natknąłem ten problem w nieco ukrytym scenariuszu: ListView, z którym miałem do czynienia, pochodzi z PreferenceFragment, a nagłówek reprezentuje kategorię PreferenceCategory. Tak więc moja swoboda konfigurowania ListView była poważnie ograniczona. Ale były dwa podejścia (częściowo inspirowane innymi odpowiedziami na tej stronie). Jednym z nich było dodanie niestandardowego układu do mojej kategorii preferencji (przy użyciu klasy, która jest extends android.preference.PreferenceCategory, patrz Custom PreferenceCategory Headings). Ale znalazłem łatwiejszy obejście: dla pierwszego Pierwszeństwo w tym PreferenceCategory, zastąpić onCreateView():

@Override public View onCreateView(ViewGroup parent) { 
    parent.setTop(-parent.getChildAt(0).getTop()); 
    return super.onCreateView(parent); 
} 
3

Problemem jest to, że są zawsze tworzenia nowego obiektu, gdy robisz:

View headerView = someView 

WIĘC nowy widok nie jest taki sam jak widok już dodana jako nagłówek ListView, spróbuj tego:

View headerView = inflater.inflate(R.layout.adapter_datatable_saleitem_header, null, false); 
     headerView.setTag(this.getClass().getSimpleName() + "header"); 
     if (listView.getHeaderViewsCount() > 0) { 
      View oldView = listView.findViewWithTag(this.getClass().getSimpleName() + "header"); 
      if (oldView != null) { 
       listView.removeHeaderView(oldView); 
      } 
     } 
1

można sprawdzić, czy nagłówek count> 0 wtedy usunąć nagłówek i dodać go ponownie.
to działa dobrze dla mnie.

View _headerView; 
private void function HandleHeaderView(){ 
     if(listView.getHeaderViewsCount() > 0) 
     { 
      listView.removeHeaderView(_headerView); 
     } 

     /* Add list view header */ 
     _headerView = GetHeaderView(); 
     listView.addHeaderView(_headerView); 
} 


private View GetHeaderView() 
{ 
     View header = getLayoutInflater().inflate(R.layout.header_layout, null); 
     // TODO: ... 

     return header 
}