Скрыть нижний колонтитул в ListView?
у меня есть ListView. Данные за ним извлекаются из интернета, в наборах 10-30 элементов всякий раз, когда пользователь прокручивает весь путь до дна. Чтобы указать, что он загружает больше элементов, я использовал addFooterView() добавить простой вид, который отображает "загрузка...- сообщение и прядильщик. Теперь, когда у меня нет данных (больше нет данных для извлечения), я хочу скрыть это сообщение. Я попытался сделать:
loadingView.setVisibility(View.GONE);
к сожалению, в то время как это скрывает вид, он оставляет пространство для него. Т. е. я получаю большое пустое пространство, где раньше было сообщение "загрузка". Как я могу правильно скрывать этот вид?
Я не могу использовать removeFooterView() потому что мне может понадобиться показать его снова, и в этом случае я не могу позвонить addFooterView() снова, потому что адаптер уже установлен на ListView, и вы не можете позвонить addHeaderView()/addFooterView() после установки адаптера.
13 ответов:
кажется, что вы можете позвонить
addHeaderView()/addFooterView()послеsetAdapter()пока вы вызываете один из этих методов хотя бы один раз до. Это довольно плохое дизайнерское решение от Google, поэтому я подал вопрос. Объедините это сremoveFooterView()и у вас есть мое решение.+1 для двух других ответов, которые я получил, они действительны (и, возможно, более правильные) решения. Мой, Однако, самый простой, и мне нравится простота, поэтому я отмечу свой собственный ответ, как принято.
попробуйте установить высоту нижнего колонтитула в 0px или 1px, прежде чем скрывать его. Кроме того, оберните представление нижнего колонтитула в
wrap_contentвысотаFrameLayoutи Скрыть/показать внутренний вид, оставивFrameLayoutвидимый; высота должна обернуть правильно тогда.
в моем случае addFooterView / removeFooterView() вызывают некоторые артефакты. И я нашел другое решение. Я использовал FrameLayout в качестве нижнего колонтитула. И когда я хочу, чтобы добавить нижний колонтитул, я позвонил mFrameFooter.addView (myFooter); и mFrameFooter.removeAllViews (); for remove.
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"в группе просмотра, которая содержит кнопку" Загрузить больше". Не обязательно быть FrameLayout, см. ниже простой рабочий пример, который использует LinearLayout.
оба изображения показывают экран, который прокручивается до самого низа. Первый имеет видимый нижний колонтитул, который обертывает кнопку "Загрузить больше". Второе изображение показывает, что нижний колонтитул сворачивается, если вы установите видимость кнопки исчезла.
вы можете снова показать нижний колонтитул (внутри некоторого обратного вызова), изменив видимость:
loadMore.setVisibility(View.VISIBLE); // set to View.GONE to hide it again
выполните инициализацию 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-файла, либо создать его программно), а затем добавить свой вид, который вы хотите скрыть или показать в нем.
и вы можете установить вид, но не Родительский макет, видимый или исчезнувший или что-то еще сейчас. Это работает на меня.
используется
footer.removeAllViews();это не удаляет нижний колонтитул, но смывает детей. Вам снова придется заселять детей. Можно проверить по
footer.getChildCount()<2
Я также обнаружил, что можно позвонить
onContentChanged()(Если вы используетеListActivity) в силу пересоздатьListViewесли мне нужно добавитьHeaderViewпослеsetAdapter()звоните, но это очень некрасивый Хак.
Я создал ListView, который обрабатывает это. Он также имеет возможность использовать EndlessScrollListener я создал для обработки бесконечных listviews, который загружает данные, пока нет больше данных для загрузки.
вы можете увидеть эти классы здесь:
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 и вид нижнего колонтитула (просто под макет) в родительский макет, такой как LinnearLayout, помните, что нижний колонтитул ниже listview.
контроллер этот вид нижнего колонтитула исчез и видимость, как nomal view. И готово!
сначала я добавляю свой нижний колонтитул в listview, как это
listView.addFooterView(Utils.b);затем при нажатии кнопки, я удаляю вид,
listView.removeFooterView(Utils.b);я добавляю нижний колонтитул каждый раз,когда я нажимаю асинхронный, и theus не дублируют запись.Я мог бы также проверить для графа и так это так,
if(listView.getFooterViewsCount() > 0){//if footer is added already do something}
когда вы хотите удалить колонтитул в
ListViewпросто позвониlistView.addFooterView(new View(yourContext));Он добавит фиктивный пустой вид, который не будет резервировать пространство


Comments