Pour une raison quelconque, la vue vide, un TextView dans ce cas, apparaît toujours même lorsque le ListView n'est pas vide. Je pensais que le ListView détecterait automatiquement quand afficher la vue vide.
<RelativeLayout Android:id="@+id/LinearLayoutAR"
Android:layout_height="fill_parent"
Android:layout_width="fill_parent">
<ListView Android:id="@+id/ARListView"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"></ListView>
<ProgressBar Android:id="@+id/arProgressBar"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_centerHorizontal="true"
Android:layout_centerVertical="true"></ProgressBar>
<!-- Here is the view to show if the list is emtpy -->
<TextView Android:id="@id/Android:empty"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:text="No Results" />
</RelativeLayout>
Comment puis-je brancher correctement la vue vide?
Cela devrait être comme ça:
<TextView Android:id="@Android:id/empty"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:text="No Results" />
Notez l'attribut id.
Lorsque vous prolongez FragmentActivity
ou Activity
et pas ListActivity
, vous voudrez jeter un coup d'œil à:
Comme le dit appsthatmatter, dans la mise en page, quelque chose comme:
<ListView Android:id="@+id/listView" ... />
<TextView Android:id="@+id/emptyElement" ... />
et dans l'activité liée:
this.listView = (ListView) findViewById(R.id.listView);
this.listView.setEmptyView(findViewById(R.id.emptyElement));
Fonctionne-t-il également avec un GridView ...
J'ai essayé toutes les solutions ci-dessus.Je suis venu résoudre le problème.Voici, je poste la solution complète.
Le fichier XML:
<RelativeLayout
Android:id="@+id/header_main_page_clist1"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:layout_margin="20dp"
Android:paddingBottom="10dp"
Android:background="#ffffff" >
<ListView
Android:id="@+id/lv_msglist"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:divider="@color/divider_color"
Android:dividerHeight="1dp" />
<TextView
Android:id="@+id/emptyElement"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_centerInParent="true"
Android:text="NO MESSAGES AVAILABLE!"
Android:textColor="#525252"
Android:textSize="19.0sp"
Android:visibility="gone" />
</RelativeLayout>
TextView ("(+ @ id/emptyElement") est l’espace réservé pour la listview vide.
Voici le code pour la page Java:
lvmessage=(ListView)findViewById(R.id.lv_msglist);
lvmessage.setAdapter(adapter);
lvmessage.setEmptyView(findViewById(R.id.emptyElement));
N'oubliez pas de placer le emptyView après avoir lié l'adaptateur à listview.Mine ne fonctionnait pas pour la première fois et après avoir déplacé le setEmptyView après le setAdapter, il fonctionne maintenant.
Sortie:
Je vous recommande fortement d'utiliser ViewStubs comme ceci
<FrameLayout
Android:layout_width="fill_parent"
Android:layout_height="0dp"
Android:layout_weight="1" >
<ListView
Android:id="@Android:id/list"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent" />
<ViewStub
Android:id="@Android:id/empty"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_gravity="center"
Android:layout="@layout/empty" />
</FrameLayout>
Voir l'exemple complet de Cyril Mottier
<ListView Android:id="@+id/listView" ... />
<TextView Android:id="@+id/empty" ... />
and in the linked Activity:
this.listView = (ListView) findViewById(R.id.listView);
this.listView.setEmptyView(findViewById(R.id.empty));
Cela fonctionne clairement avec FragmentActivity si vous utilisez la bibliothèque de support. Ceci a été testé en construisant pour l’API 17 c’est-à-dire l’image 4.2.2.
Code d'activité, il est important d'étendre ListActivity
.
package com.example.mylistactivity;
import Android.app.ListActivity;
import Android.os.Bundle;
import Android.widget.ArrayAdapter;
import com.example.mylistactivity.R;
// It's important to extend ListActivity rather than Activity
public class MyListActivity extends ListActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mylist);
// shows list view
String[] values = new String[] { "foo", "bar" };
// shows empty view
values = new String[] { };
setListAdapter(new ArrayAdapter<String>(
this,
Android.R.layout.simple_list_item_1,
Android.R.id.text1,
values));
}
}
Layout xml, les identifiants dans les deux vues sont importants.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:orientation="vertical"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent">
<!-- the Android:id is important -->
<ListView
Android:id="@Android:id/list"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"/>
<!-- the Android:id is important -->
<TextView
Android:id="@Android:id/empty"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:text="i am empty"/>
</LinearLayout>
Juste pour ajouter que vous n'avez pas vraiment besoin de créer de nouveaux identifiants, les opérations suivantes fonctionneront.
Dans la mise en page:
<ListView
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:id="@Android:id/list"/>
<TextView
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:id="@Android:id/empty"
Android:text="Empty"/>
Puis dans l'activité:
ListView listView = (ListView) findViewById(Android.R.id.list);
listView.setEmptyView(findViewById(Android.R.id.empty));
J'ai eu ce problème. Je devais obliger ma classe à étendre ListActivity plutôt que Activity et à renommer ma liste dans XML en Android:id="@Android:id/list"
Une solution par programme sera:
TextView textView = new TextView(context);
textView.setId(Android.R.id.empty);
textView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT));
textView.setText("No result found");
listView.setEmptyView(textView);