2010-11-30 7 views
77

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

loadingView.setVisibility(View.GONE); 

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

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

ответ

83

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

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

37

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

+0

Как вы устанавливаете высоту представления? Я попробовал setMinimumHeight (0); прежде чем скрываться, но, похоже, не работает. Я установил его в GONE, но пространство ячейки все еще осталось позади. – Maurice 2011-12-19 02:11:18

+0

Высота и ширина - это параметры макета, поэтому вам нужно установить объект LayoutParameters для представления с новой шириной/высотой. См. Этот ответ SO: http://stackoverflow.com/a/2767142/59058. В основном, ширина, высота и поля являются свойствами, которые действительно применяются к контейнеру вида, а не к самому представлению, поэтому вы используете объект LayoutParameter, связанный с родителями, для их определения. – 2011-12-21 16:40:01

+0

Я не думаю, что это работает для заголовка, я получил нуль на заголовок, который был прикреплен, и получил имя getLayoutParams() для. – Vadi 2012-04-15 22:55:08

4

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

+2

С примером использования этот ответ получил бы больше голосов. – 2013-09-14 03:30:01

0

Используется

footer.removeAllViews(); 

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

footer.getChildCount()<2 
0

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

1

Если вы хотите удалить колонтитул в ListView просто позвоните

listView.addFooterView(new View(yourContext)); 

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

0

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

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

https://github.com/CyberEagle/OpenProjects/blob/master/android-projects/widgets/src/main/java/br/com/cybereagle/androidwidgets/helper/ListViewWithLoadingIndicatorHelper.java - Helper, чтобы сделать возможным использовать функции без расширения от 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. Вы можете использовать этот класс напрямую или от него.

5

в моем случае 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(); 
2

Как отметил @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"/> 

2

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

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

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

0

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

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

3

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

1.Add вид колонтитула первой обзорность

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

2.Set

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

3.Set невидимость

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

0

первый я добавляю свой колонтитул в ListView, как этот

listView.addFooterView(Utils.b); 

Затем на кнопку мыши, я извлекаю вид,

listView.removeFooterView(Utils.b); 

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

if(listView.getFooterViewsCount() > 0){//if footer is added already do something} 
Смежные вопросы