Подтвердить что ты не робот

Отобразить сообщение "Нет товара" в ListView

Я создал некоторые пользовательские интерфейсы в моих приложениях для Android, и есть некоторые элементы управления ListView - помимо других элементов управления - внутри представления. Из-за этого я использовал "Активность" в качестве базового класса активности.

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

4b9b3361

Ответ 2

У вас может быть пустой вид без ListActivity! Правильный метод выглядит следующим образом

Сначала добавьте "пустой вид" в ваш макет XML под вашим списком

...
<ListView 
    android:id="@+id/list"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    />

<TextView
    android:id="@+id/empty"
    android:text="Empty"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center"
    />
...

Далее переопределите метод onContentChanged вашей активности и установите пустой вид вашего списка в пустой вид:

@Override
public void onContentChanged() {
    super.onContentChanged();

    View empty = findViewById(R.id.empty);
    ListView list = (ListView) findViewById(R.id.list);
    list.setEmptyView(empty);
}

Что это! Android будет заботиться о том, чтобы скрывать/показывать список и пустые представления при обновлении адаптера.

Магия

Решение о том, отображается ли пустое представление или нет, обрабатывается суперклассом ListView, AdapterView. AdapterView регистрирует a DataSetObserver на адаптере, поэтому он уведомляется о каждом изменении данных. Это вызывает вызов checkFocus в AdapterView, который содержит следующие строки

if (mEmptyView != null) {
    updateEmptyStatus((adapter == null) || adapter.isEmpty());
}

и устанавливает видимость пустого представления в зависимости от того, пуст или нет адаптер.

Ответ 3

Просто соедините ListView с TextView:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ListView
    android:id="@+id/list"
    android:layout_height="fill_parent"
    android:layout_width="fill_parent" />
<TextView
    android:id="@+id/list_empty"
    android:text="No Item"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"/>
</LinearLayout>

Затем проверьте количество элементов видимости на символе ListView соответственно:

    ListView lv = (ListView)findViewById(R.id.list);
    lv.setVisibility((adapter.isEmpty())?View.GONE:View.VISIBLE); 

Если вы используете Custom Adapter, вы можете сделать это в переопределенном методе notifyDataSetChanged.

Ответ 4

Вы можете использовать Toast Message для этого.

Проверьте значение Count of the Adapter на adapter.getCount()

if(Adapter.getCount()!=0){
      List.setAdapter(Adapter); 
}else{
     Toast.makeText(YourActivityName.this, "No Items Available",Toast.LENGTH_SHORT).show();
}

Ответ 5

Для кода макета Джозефа вам нужно отредактировать @+ id/list и @+ id/empty для @android: id/*, например:

<ListView 
    android:id="@android:id/list"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    />

<TextView
    android:id="@android:id/empty"
    android:text="Empty"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center"
    />

Таким образом, вам даже не нужно переопределять функцию onContentChanged().

Ответ 6

Самый простой способ добиться этого - использовать ListFragment вместо ListActivity. ListFragment имеет следующий удобный метод:

setEmptyText("My no items message...");

Кроме того, использование класса ListFragment имеет другие преимущества. Например, возможность объединить его с новой библиотекой AppCompat (которую вы не можете сделать с ListActivity, потому что вам нужно перейти от ActionBarActivity).