Ответ 1
Используйте метод setEmptyView, который устанавливает представление, чтобы показать, что адаптер пуст.
У меня есть ListView в моей деятельности, который принимает значения из класса расширения SimpleAdapter. Это правильно работает, когда я добавляю или удаляю в нем некоторые данные.
Но моя проблема в том, что когда мой список элементов пуст, я хотел бы заменить listView сообщением типа "No item inhere" или что-то в этом роде.
Я попытался сделать это следующим образом:
class FavAdapter extends SimpleAdapter{
Activity context;
ArrayList<HashMap<String,String>> data;
String[] items;
int[] champs;
int layout;
FavAdapter(Activity _context, ArrayList<HashMap<String,String>> _data, int _layout, String[] _items, int[] _champs){
super(_context, _data, _layout, _items, _champs );
this.data = _data;
this.context = _context;
this.items = _items;
this.layout = _layout;
this.champs = _champs;
}
public View getView(int pos, View convertView, ViewGroup parent){
//Recycling
View row = convertView;
//Else get from XML
if(row == null){
LayoutInflater infla = context.getLayoutInflater();
row = infla.inflate(layout, null);
}
//If there are data
if(data.size() > 0){
/**** Here I am correctly constructing row *****/
...
}
//Else
else{
TextView txt = new TextView(ActivityFavoris.this);
txt.setText("Not data inhere");
LinearLayout ll = (LinearLayout) row.findViewById(R.id.result_lyt_principal);
ll.addView(txt);
}
return row;
}
Проблема в том, что мой список никогда не имеет значения 0. Фактически, когда данные пустые, адаптер не вызывается.
Может кто-нибудь объяснить мне, как я могу это сделать по-другому? Спасибо заранее.
Изменить: Используя ваши ответы, мне это удается. Мое решение: setContentView должно использоваться с findViewById (android.R.id.empty), но, если у меня есть два разных listView в вашей деятельности, которым нужны разные пустые представления, вам придется найти их в другом макете. Таким образом, андроид автоматически выберет правильный вид, когда список будет пустым, и ничего не нужно делать в адаптере, когда data.size равно 0.
example: in Activity:
public void onCreate(Bundle b){
super.onCreate(b);
lv1 = (ListView) findViewById(R.id.listviewone);
lv2 = (ListView) findViewById(R.id.listviewtwo);
//****set listview adater***//
...
//set empty view
lv1.setEmptyView(findViewById(R.id.layoutone).findViewById(android.R.id.empty));
lv2.setEmptyView(findViewById(R.id.layouttwo).findViewById(android.R.id.empty));
}
с этим xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<LinearLayout
android:id="@+id/layoutone"
android:orientation="horizontal"
android:layout_weight="1"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<ListView
android:id="@+id/listviewone"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
<TextView
android:id="@android:id/empty"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Pas de favoris enregistrées" />
</LinearLayout>
<LinearLayout
android:id="@+id/layouttwo"
android:orientation="horizontal"
android:layout_weight="1"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<ListView
android:id="@+id/listviewtwo"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
<TextView
android:id="@android:id/empty"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Pas de favoris enregistrées" />
</LinearLayout>
Используйте метод setEmptyView, который устанавливает представление, чтобы показать, что адаптер пуст.
Вышеупомянутый ответ звучит нормально, но для записи причина, по которой ваш метод не вызывается, вероятно, потому, что ваша реализация getCount() возвращает что-то вроде data.size() - значение 0. Это означает, что ListView будет никогда не вызывайте getView вообще.
Вместо этого вы можете сделать что-то вроде этого:
public int getCount() {
if (data.size()==0) {
return 1;
}
return data.size();
}
Надеюсь, что это полезно.
Вы вызываете этот адаптер в некоторой активности. там адаптер установлен в любое listview. Перед установкой адаптера в представление списка вы можете проверить, что такое размер arraylist. если размер равен нулю, вы можете добавить сообщение "No item inhere"
в arraylist, сделав hashmap
Создайте список с пометкой "нет элементов" по умолчанию. Когда добавлен первый элемент, заново создайте список и удалите запись по умолчанию.