Удалить заголовок из спискаView

У меня возникают проблемы при попытке удалить заголовок из listView . Сначала я использую addHeaderView() чтобы добавить его, но когда я addHeaderView() на другой макет, я хочу, чтобы он исчез, но removeHeaderView() не работает …

Я также попытался установить видимость на GONE, и он не исчезнет …

Что я могу сделать?

заранее спасибо

Попробуйте упомянутый ниже подход ..

ListView#addHeaderView Android ListView#addHeaderView и ListView#addFooterView странны: перед установкой адаптера ListView вы должны добавить представления верхнего и нижнего колонтитула, чтобы ListView мог принимать верхние и нижние колонтитулы, иначе вы получите исключение. Здесь мы добавляем ProgressBar (spinner) в качестве headerView:

// spinner – это ProgressBar

 listView.addHeaderView(spinner); 

Мы хотели бы показать и спрятать этот вертел по своему усмотрению, но удаление его прямо опасно, потому что мы никогда не сможем его добавить снова, не уничтожая ListView – помните, мы не можем добавитьHeaderView после того, как мы Это адаптер:

 listView.removeHeaderView(spinner); //dangerous! 

Так что давай спрячем это! Оказывается, это тоже сложно. Простое скрытие представления счетчика приводит к пустой, но все еще видимой области заголовка.

Теперь попробуйте скрыть счетчик:

 spinner.setVisibility(View.GONE); 

Результат: область заголовка все еще видна с уродливым пространством:

Решение состоит в том, чтобы поместить индикатор выполнения в LinearLayout, который обертывает его содержимое и скрывает содержимое. Таким образом, обтекание LinearLayout рушится, когда его содержимое будет скрыто, что приведет к тому, что заголовок ViewView будет технически все еще присутствовать, но 0dip high:

 <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> 

Затем установите макет как заголовок:

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

И когда нам нужно скрыть это, скройте содержимое макета, а не макет:

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

Теперь заголовок исчезает из представления. Не более уродливое пространство наверху!

Большинство людей не любят использовать AddHeaderView , но иногда мне было очень удобно, чтобы избежать модификации сложных адаптеров или если заголовки не очень связаны с ними.

С помощью этого простого трюка вы сможете легко удалить / добавить заголовки :

Я добавляю пустой LinearLayout с orientation vertical и высотой wrap_content , как единственный вид заголовка (пусть mListView будет целевым mListView ):

  LinearLayout mCustomHeaders=new LinearLayout(context); mCustomHeaders.setOrientation(LinearLayout.VERTICAL); mListView.addHeaderView(mCustomHeaders); mListView.setAdapter (.......) 

Тем не менее, я могу добавить случайный материал в любом месте в список как заголовок, даже если список заполнен:

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

Вы также можете удалить все заголовки в любое время:

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

У вас есть идея … Надеюсь, это поможет!

Проблема в том, что вы всегда создаете новый объект, когда делаете:

  View headerView = someView 

Таким образом, новое представление не совпадает с представлением, уже добавленным в качестве заголовка listView, попробуйте следующее:

 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); } } 

Где drawerLogoView – это мой headerview, вот что я делаю:

  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)); 

Таким образом, он становится невидимым: D Чтобы показать его, вы можете использовать это:

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

Вы можете проверить, есть ли счетчик заголовков> 0, затем удалить заголовок и добавить его снова.
Его работы прекрасны для меня.

  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 } 

Если вы используете addHeaderView (), после этого вы не сможете удалить свой заголовок.

Поэтому не используйте addHeaderView (). Скорее создайте свой собственный адаптер, который объединяет ваш основной список представлений с вашим заголовком. Хотя мой MergeAdapter не будет обрабатывать ваш конкретный случай, вы можете использовать его, чтобы увидеть концепцию смешивания нескольких источников строк:

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

Я столкнулся с этой проблемой в слегка замаскированном сценарии: ListView, с которым я имел дело, пришел из PreferenceFragment, а заголовок представляет собой PreferenceCategory. Итак, моя свобода настройки ListView была сильно ограничена. Но было два подхода (частично вдохновленные другими ответами на этой странице). Один из них заключался в том, чтобы добавить пользовательский макет в мою PreferenceCategory (используя класс, который extends android.preference.PreferenceCategory , см. extends android.preference.PreferenceCategory Custom PreferenceCategory» ). Но я нашел более легкое обходное решение: для первого Предпочтения в этой PreferenceCategory я переопределяю onCreateView() :

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