Я хотел бы, чтобы 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>