Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 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);
}