Перечислить активность с заголовком, нижним колонтитулом и пустым

Я хотел бы, чтобы listview в ListActivity отображался с верхним и нижним колонтитулами, видимыми все время, даже если данные списка пустые.

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

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

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

Есть ли способ сделать это красиво, кроме взлома, как добавление поддельной записи?

Ответ 1

Сделайте свой пустой вид с заголовком.

то есть.

 <ListView />
 <RelativeLayout
    android:id="@android:id/empty"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
       // Add whatever you want here including your header
 </RelativeLayout>

Ответ 2

Этот ответ немного запоздалый, но вы можете просто переопределить BaseAdapter.isEmpty(), чтобы вернуть false.

public boolean isEmpty() {
    return false;
}

Ответ 3

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

Ответ 4

Хорошо, это обходное решение - это взлом. Но, не создавая поддельный элемент.

Для ArrayAdapter вы можете добавить нулевой элемент... т.е.

myAdapter.add(null);

И в MyAdapter getView (..) вы делаете что-то вроде:

myItem = getItem(position);
if (myItem == null) {
   return getLayoutInflater().inflate(R.layout.my_empty_row, null);
} else {
...
}

Ответ 5

Я обнаружил, что header/footer всегда будет видимым, если вы не вызываете ListView.setEmptyView.

Вместо этого вручную покажите/скройте свой пустой вид:

emptyView.setVisibility(list.size() == 0 ? View.VISIBLE : View.GONE);

Ответ 6

Я встречаю ту же проблему, если ListView не имеет элемента, вы можете ListView.setAdapter(новый SomeAdapter (новый ArrayList())); и заголовок также отображается.

Ответ 7

В моем случае у меня были оба заголовка и нижнего колонтитула. Я разместил mEmptyView в нижнем колонтитуле.

Во-первых, как указано user1034295 , я переопределил метод адаптера isEmpty():

@Override
public boolean isEmpty() {
// If not overridden, then this will return `true` if your list is empty
// Thus, you won't see header/footer views
   return false;
}

Адаптер ExpandableListView getGroupCount(). Переопределите соответствующий метод для вашего адаптера.

@Override
public int getGroupCount() {
    int size = null != mData ? mData.size() : 0;
    if (0 == size) mHostFragment.toggleEmptyView(true);
    else mHostFragment.toggleEmptyView(false);
    return size;
}

В вашей деятельности/фрагменте

public void toggleEmptyView(boolean show) {
    if(show && mEmptyView.getVisibility() != View.VISIBLE)
        mEmptyView.setVisibility(View.VISIBLE);
    else if (!show && mEmptyView.getVisibility() != View.GONE)
        mEmptyView.setVisibility(View.GONE);
}

mEmptyView является дочерним элементом в нижнем колонтитуле ListView. Итак, когда ваш список станет 0, вы увидите, что ваши заголовки/нижние колонтитулы остались + mEmptyView станут видимыми.

Ответ 8

Вы можете поместить списокViewView и пустой макет вместе в FrameLayout и поставить пустой размер макета в размере заголовка, тогда вы можете изменить видимость пустого представления, когда элемент добавлен в список.

Макет

будет похож на этот:

<FrameLayout
    android:layout_width="wrap_content"
    android:layout_height="0dp"
    android:layout_weight="1">

    <ListView
        android:id="@+id/myListView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        tools:listheader="@layout/myHeader"/>

    <LinearLayout
        android:layout_marginTop="@dimen/headerHeight"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/white"
        android:id="@+id/emptyLayout">

       //insert your layout here

    </LinearLayout>

</FrameLayout>