it-roy-ru.com

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

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

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

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

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

22
hasiertxo

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

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

// спиннер - это ProgressBar

listView.addHeaderView(spinner);

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

listView.removeHeaderView(spinner); //dangerous!

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

Теперь попробуйте спрятать спиннер:

spinner.setVisibility(View.GONE);

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

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

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

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

52
Praful Bhatnagar

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

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

Я добавляю пустой LinearLayout с orientation vertical и высотой wrap_content в качестве единственного представления заголовка (пусть mListView будет целью 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

Вы поняли идею .... Надеюсь, это поможет!

17
rupps

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

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

Где drawerLogoView мой заголовок, вот что я делаю:

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

Вы можете проверить количество заголовков> 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
 }
1
Hamid

Я столкнулся с этой проблемой в слегка замаскированном сценарии: 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);
}
0
Alex Cohn

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

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

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

0
Miloš