Скрыть нижний колонтитул в ListView?

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

 loadingView.setVisibility(View.GONE); 

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

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

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

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

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

В моем случае addFooterView / removeFooterView () вызывает некоторые артефакты. И я нашел другое решение. Я использовал FrameLayout как FooterView. И когда я хочу добавить Footer, я назвал 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(); 

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

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

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

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

 android:layout_height="wrap_content" 

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

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

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

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

ListView с видимым нижним колонтитуломListView с нижним колонтитулом

Выполните инициализацию 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"/> 

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

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

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

Когда вы хотите удалить нижний колонтитул в ListView просто вызовите

 listView.addFooterView(new View(yourContext)); 

Он добавит пустой пустынный вид, который не зарезервирует места

Используемый

 footer.removeAllViews(); 

Это не удаляет нижний колонтитул, но очищает детей. Вы снова должны заселять детей. Можно проверить

 footer.getChildCount()<2 

Я также обнаружил, что возможен вызов onContentChanged() (если вы используете ListActivity ) для принудительного воссоздания ListView если мне нужно добавить HeaderView к ним после setAdapter() , но это очень уродливое взломать.

Я создал 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 – The EndlessListView. Вы можете использовать этот класс напрямую или от него.

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

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

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

 listView.addFooterView(Utils.b); 

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

 listView.removeFooterView(Utils.b); 

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

 if(listView.getFooterViewsCount() > 0){//if footer is added already do something} 
Intereting Posts