Скрыть вид нижнего колонтитула в ListView? - PullRequest
78 голосов
/ 30 ноября 2010

У меня есть ListView.Данные за ним берутся из Интернета, в наборах по 10-30 пунктов всякий раз, когда пользователь прокручивает весь путь до самого дна.Чтобы указать, что он загружает больше элементов, я использовал addFooterView(), чтобы добавить простое представление, отображающее сообщение «Загрузка ...» и счетчик.Теперь, когда у меня нет данных (больше нет данных для извлечения), я хочу скрыть это сообщение.Я попытался сделать:

loadingView.setVisibility(View.GONE);

К сожалению, хотя это скрывает вид, оно оставляет место для него.Т.е. я получаю большое пустое место, где раньше было сообщение «Загрузка».Как я могу правильно скрыть это представление?

Я не могу использовать removeFooterView(), потому что мне может понадобиться показать его снова, и в этом случае я не могу снова вызвать addFooterView(), потому что адаптер ужебыл установлен на ListView, и вы не можете позвонить addHeaderView() / addFooterView() после установки адаптера.

Ответы [ 13 ]

84 голосов
/ 01 декабря 2010

Похоже, вам разрешено вызывать addHeaderView() / addFooterView() после setAdapter(), если вы вызываете один из этих методов хотя бы один раз до .Это довольно плохое дизайнерское решение от Google, поэтому я подал вопрос .Объедините это с removeFooterView(), и у вас будет мое решение.

+ 1 для двух других ответов, которые я получил, они являются действительными (и, возможно, более правильными) решениями.Мой, однако, самый простой, и мне нравится простота, поэтому я отмечу свой собственный ответ как принятый.

37 голосов
/ 30 ноября 2010

Попробуйте установить высоту нижнего колонтитула в 0px или 1px, прежде чем скрывать его.В качестве альтернативы, оберните нижний колонтитул в wrap_content height FrameLayout и скройте / покажите внутренний вид, оставляя FrameLayout видимым;тогда высота должна быть правильной.

5 голосов
/ 23 апреля 2014

в моем случае addFooterView / removeFooterView () вызывают некоторые артефакты. И я нашел другое решение. Я использовал FrameLayout как FooterView. И когда я хочу добавить нижний колонтитул, я назвал mFrameFooter.addView (myFooter); и mFrameFooter.removeAllViews (); для удаления.

FrameLayout frameLayout = new FrameLayout(this);
listView.addFooterView(frameLayout);
......
......
//For adding footerView
frameLayout.removeAllViews();
frameLayout.addView(mFooterView);
//For hide FooterView
frameLayout.removeAllViews();
4 голосов
/ 30 ноября 2010

В библиотеке Droid-Fu есть класс, предназначенный для показа и скрытия нижнего колонтитула при загрузке: ListAdapterWithProgress .

3 голосов
/ 13 ноября 2014

Хорошо работает в моем проекте:

1. Сначала добавьте нижний колонтитул

mListView.addFooterView(mFooterView); mListView.setAdapter(mAdapter);

2. Видимость набора

mFooterView.setVisibility(View.GONE); mFooterView.setPadding(0, 0, 0, 0);

3.Настройка невидимости

mFooterView.setVisibility(View.GONE); mFooterView.setPadding(0, -1*mFooterView.getHeight(), 0, 0);

2 голосов
/ 20 сентября 2014

Это должна быть ошибка Android.

Вам не нужно динамически удалять или добавлять вид нижнего колонтитула. Вам просто нужно создать родительский макет с неопределенной высотой (либо накачать его из файла XML, либо создать его программно), а затем добавить свой вид, который вы хотите скрыть или показать в нем.

И вы можете установить вид, но НЕ родительский макет, на VISIBLE или GONE или что-то еще сейчас. У меня это работает.

2 голосов
/ 11 сентября 2014

Как отметил @YoniSamlan, это может быть достигнуто простым способом.Вы должны указать

android:layout_height="wrap_content" 

в ViewGroup, которая содержит кнопку «Загрузить еще».Не обязательно должен быть FrameLayout, см. Ниже простой пример работы, который использует LinearLayout.

Оба изображения показывают экран, который прокручивается до самого дна.Первый из них имеет видимый нижний колонтитул, который оборачивается вокруг кнопки «загрузить еще».Второе изображение показывает, что нижний колонтитул рухнет, если вы установите видимость кнопки в GONE.

Вы можете снова показать нижний колонтитул (внутри некоторого обратного вызова), изменив видимость:

loadMore.setVisibility(View.VISIBLE);  // set to View.GONE to hide it again

listView with visible footer listView with footer gone

Выполните инициализацию listView как обычно

    // Find View, set empty View if needed
    mListView = (ListView) root.findViewById(R.id.reservations_search_results);
    mListView.setEmptyView(root.findViewById(R.id.search_reservations_list_empty));

    // Instantiate footerView using a LayoutInflater and add to listView
    footerView = ((LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE))
            .inflate(R.layout.load_more_footer_view, null, false);
    // additionally, find the "load more button" inside the footer view
    loadMore = footerView.findViewById(R.id.load_more);
    loadMore.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            fetchData();
        }
    });

    // add footer view to the list
    mListView.addFooterView(footerView);

    // after we're done setting the footerView, we can setAdapter
    adapter = new ReservationsArrayAdapter(getActivity(), R.layout.list_item_reservations_search, reservationsList);
    mListView.setAdapter(adapter);

load_more_footer_view.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<Button
    android:id="@+id/load_more"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="9dp"
    android:gravity="center"
    android:layout_gravity="center"
    android:background="@drawable/transparent_white_border"
    android:textColor="@android:color/white"
    android:text="@string/LOAD_MORE"/>

0 голосов
/ 03 марта 2017

сначала я добавляю свой нижний колонтитул в просмотр списка, как это

listView.addFooterView(Utils.b);

Затем при нажатии кнопки я удаляю вид,

listView.removeFooterView(Utils.b);

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

if(listView.getFooterViewsCount() > 0){//if footer is added already do something}
0 голосов
/ 03 октября 2014

У меня есть небольшой способ взломать эту проблему везде.Поместите представление списка и нижнего колонтитула (просто суб-макет) в родительский макет, такой как LinnearLayout, помните, что нижний колонтитул под списком просмотра.

Контроллер этого представления нижнего колонтитула исчез и видимость похожа на нормальное представление.И готово!

0 голосов
/ 14 июня 2013

Я создал ListView, который обрабатывает это.Он также имеет возможность использовать созданный мной EndlessScrollListener для обработки бесконечных списков, который загружает данные до тех пор, пока не будет больше данных для загрузки.

Эти классы можно увидеть здесь:

https://github.com/CyberEagle/OpenProjects/blob/master/android-projects/widgets/src/main/java/br/com/cybereagle/androidwidgets/helper/ListViewWithLoadingIndicatorHelper.java - помощник, позволяющий использовать функции без расширения из SimpleListViewWithLoadingIndicator.

https://github.com/CyberEagle/OpenProjects/blob/master/android-projects/widgets/src/main/java/br/com/cybereagle/androidwidgets/listener/EndlessScrollListener.java - прослушиватель, который начинает загрузку данных, когда пользователь собирается достичь дна ListView.

https://github.com/CyberEagle/OpenProjects/blob/master/android-projects/widgets/src/main/java/br/com/cybereagle/androidwidgets/view/SimpleListViewWithLoadingIndicator.java - EndlessListView.Вы можете использовать этот класс напрямую или расширять его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...