Удалить заголовок из спискаView
У меня возникают проблемы при попытке удалить заголовок из listView
. Сначала я использую addHeaderView()
, чтобы добавить его, но когда я перехожу на другой макет, я хочу, чтобы он исчез, но removeHeaderView()
не работает...
Я также попытался установить видимость на GONE, и он не исчезнет...
Что я могу сделать?
Заранее спасибо
Ответы
Ответ 1
Попробуйте упомянутый ниже подход.
Android ListView#addHeaderView
и ListView#addFooterView
- это странно: перед созданием адаптера ListView необходимо добавить представления заголовка и нижнего колонтитула, чтобы ListView мог принимать верхние и нижние колонтитулы, иначе вы получите исключение. Здесь мы добавляем ProgressBar (spinner) в качестве headerView:
//spinner - это ProgressBar
listView.addHeaderView(spinner);
Мы хотели бы показать и спрятать этот прядильник по своему усмотрению, но удаление его напрямую опасно, потому что мы никогда не сможем его добавить снова, не уничтожая ListView - помните, мы не можем добавитьHeaderView после у нас есть адаптер:
listView.removeHeaderView(spinner); //dangerous!
Так что пусть скрывает это! Оказывается, это тоже сложно. Простое скрытие представления spinner приводит к пустой, но все еще видимой области заголовка.
![]()
Теперь попробуйте скрыть счетчик:
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);
Теперь заголовок исчезает из представления. Не более уродливое пространство наверху!
Ответ 2
Большинство людей не любят использовать AddHeaderView
, но иногда мне это очень удобно, чтобы избежать модификации сложных адаптеров или если заголовки не очень связаны с ними.
С помощью этого простого трюка вы сможете легко удалить/добавить заголовки:
Я добавляю пустой LinearLayout
с orientation vertical
и height wrap_content
в качестве единственного заголовка (пусть mListView
будет target listView
):
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
Вы получаете идею... Надеюсь, это поможет!
Ответ 3
Проблема заключается в том, что вы всегда создаете новый объект, когда вы делаете:
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);
}
}
Ответ 4
Где 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));
Ответ 5
Вы можете проверить, есть ли счетчик заголовков > 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
}
Ответ 6
Если вы используете addHeaderView(), после этого вы не сможете удалить свой заголовок.
Итак, не используйте addHeaderView(). Скорее создайте свой собственный адаптер, который
смешивает ваш основной список просмотров с вашим заголовком. Хотя моя
MergeAdapter не будет обрабатывать ваш конкретный случай, вы можете использовать его для просмотра
концепция смешивания нескольких источников строк:
https://github.com/commonsguy/cwac-merge
Ответ 7
Я столкнулся с этой проблемой в слегка замаскированном сценарии: ListView, с которым я имел дело, пришел из PreferenceFragment, а заголовок представляет PreferenceCategory. Таким образом, моя свобода настройки ListView была сильно ограничена. Но было два подхода (частично вдохновленные другими ответами на этой странице). Один из них заключался в том, чтобы добавить пользовательский макет в мою PreferenceCategory (используя класс extends android.preference.PreferenceCategory
, см. Пользовательские заголовки предпочтений). Но я нашел более легкое обходное решение: для первого Предпочтения в этой PreferenceCategory я переопределяю onCreateView()
:
@Override public View onCreateView(ViewGroup parent) {
parent.setTop(-parent.getChildAt(0).getTop());
return super.onCreateView(parent);
}