Вызов метода ListView setEmpty не работает (ничего не отображается, когда список пуст)
У меня есть Activity, который содержит ListView, определенный в XML (его не подклассифицирует класс ListActivity).
Я хочу отобразить сообщение, когда ListView пуст, поэтому я попытался сделать это с помощью метода setEmptyView:
listView = (ListView) findViewById(R.id.list);
TextView emptyListText = new TextView(this);
// also tried with the following line uncommented
// emptyListText.setId(android.R.id.empty);
emptyListText.setText(getString(R.string.EmptyList));
listView.setEmptyView(emptyListText);
Но он не работает.
Любые идеи?
Спасибо.
Ответы
Ответ 1
После вызова setText()
вам нужно добавить следующие две строки:
emptyListText.setVisibility(View.GONE);
((ViewGroup)listView.getParent()).addView(emptyListText);
Если видимость не установлена в GONE (скрытая), тогда TextView всегда будет визуализирован. Вторая строка помещает TextView в ListView ViewGroup, которая автоматически обрабатывается при использовании декларативных представлений XML.
Источник: http://www.littlefluffytoys.com/?p=74
Ответ 2
Попробуйте так...
Сначала простой макет activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >
<ListView
android:id="@+id/root_list"
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="1" />
<ViewStub
android:id="@+id/root_empty"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout="@layout/empty_view"
android:visibility="gone" />
</LinearLayout>
и из вашего MainActivity.java:
public class MainActivity extends Activity {
ListView mListView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.mListView = (ListView) findViewById(R.id.root_list);
mListView.setEmptyView(findViewById(R.id.root_empty));
mListView.setAdapter(null);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
}
Все, что помещается в R.layout.empty_view
, будет отображаться всякий раз, когда адаптер имеет значение null или isEmpty возвращает true.
Я использовал это для empty_view.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/empty_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center"
android:background="@color/gray"
android:gravity="center"
android:text="@string/list_empty"
android:textColor="@color/white"
android:textSize="24sp" />
</LinearLayout>
Ответ 3
Хм, может быть, причина в том, что в представлении нет параметров макета. Попробуйте установить некоторые параметры макета для этого вида, и я думаю, что это сработает. Что-то вроде этого:
emptyListText.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
Если это не сработает, попробуйте раздуть представление в родительском элементе ListView (R.id.list) с чем-то вроде этого:
mEmptyListView = (LinearLayout) getLayoutInflater().inflate(
R.layout.no_items,
(LinearLayout) findViewById(R.id.list));
mListView.setEmptyView(findViewById(R.id.no_items));
Я пишу это из памяти, поэтому дайте мне знать, если это не сработает или есть опечатка. В принципе, идея заключается в том, что ваше представление должно быть добавлено в макет
Ger