ListView artículo no encontrado
Mi aplicación está usando el modo de pantalla completa en pantalla y el cajón de navegación. Estoy usando listView
en mi aplicación junto con un edittext
. El edittext
es la barra de búsqueda que buscará el listview
. Tanto el listview
como el edittext
están en el cajón de navegación. Pero, cuando no hay ningún elemento de lista que coincida con la palabra buscada, el listview
se vacía.
Entonces, ¿cómo puedo agregar un mensaje "No encontrado artículo" en lugar de la lista en blanco?
- Fragmento onCreate llamado varias veces cuando vuelve a cargar el Fragmento
- ¿Cómo puedo ajustar un número exacto de elementos ListView en la pantalla?
- Cómo extraer objetos de ListView - getItemAtPosition no funcionará
- ListView - getView se llama demasiadas veces
- Cómo setCurrentPage en ViewPager según la selección del usuario y cómo sé qué artículo de la lista llamó la actividad
Busqué mucho en Internet y encontré un método setEmptyView();
Pero no pude entenderlo y por lo tanto no está funcionando. ¡Por favor, ayúdame! Tal vez esta pregunta ya se ha hecho aquí, pero por favor, dame una explicación fácil.
Aquí está mi código:
MainActivity.java
public class MainActivity extends FragmentActivity { final String[] data = {"Hydrogen","Helium","Lithium","Beryllium","Boron","Carbon","Nitrogen","Oxygen","Flourine","Noen","Sodium","Magnesium","Aluminium","Silicon","Phosphorous","Sulphur","Chlorine","Argon","Potassium","Calcium","Scandium","Titanium","Vanadium","Chromium","Manganese","Iron","Cobalt","Nickel","Copper","Zinc","Gallium","Germanium","Arsenic","Selenium","Bromine","Krypton","Rubidium","Strontium","Yttrium","Zirconium","Niobium","Molybdenum","Technetium","Ruthenium","Rhodium","Palladium","Silver","Cadmium","Indium","Tin","Antimony","Tellurium"}; ArrayAdapter<String> adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, data); final EditText searchBar = (EditText) findViewById(R.id.searchbar); final DrawerLayout drawer = (DrawerLayout)findViewById(R.id.drawer_layout); final ListView navList = (ListView) findViewById(R.id.left_drawer); final LinearLayout linearLayout = (LinearLayout)findViewById(R.id.left_drawer_layout); navList.setAdapter(adapter); searchBar.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) { MainActivity.this.adapter.getFilter().filter(cs); } @Override public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { } @Override public void afterTextChanged(Editable arg0) { } }); //the code below will automatically close the keyboard when the user will touch the listview navList.setOnScrollListener(new AbsListView.OnScrollListener() { public void onScrollStateChanged(AbsListView view, int scrollState) { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(navList.getWindowToken(), 0); } public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { } }); } }
Mainactivity.xml
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <FrameLayout android:id="@+id/content_frame" android:layout_width="match_parent" android:background="#000000" android:layout_height="match_parent" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:text="Swipe from the left to open the drawer" android:id="@+id/textView" android:layout_gravity="center" /> </FrameLayout> <LinearLayout android:id="@+id/left_drawer_layout" android:layout_height="fill_parent" android:layout_width="240dp" android:background="#111" android:orientation="vertical" android:layout_gravity="start" > <EditText android:id="@+id/searchbar" android:layout_width="230dp" android:layout_height="40dp" android:textColor="#bfc2d1" android:singleLine="true" android:padding="10dp" android:background="@drawable/search_bar" android:layout_marginLeft="3dp" android:layout_marginRight="3dp" android:imeOptions="flagNoExtractUi" android:hint=" search" > </EditText> <TextView android:id="@+id/notfound" android:layout_width="fill_parent" android:layout_height="fill_parent" style="@android:style/TextAppearance.Medium" android:gravity="center"> </TextView> <ListView android:id="@+id/left_drawer" android:layout_width="match_parent" android:layout_height="fill_parent" android:choiceMode="singleChoice" android:divider="@android:color/transparent" android:dividerHeight="0dp" android:background="#111"/> </LinearLayout> </android.support.v4.widget.DrawerLayout>
- Android ListActivity - ¿cómo agregar una vista debajo de ListView?
- Establezca onItemClick en Adaptador personalizado ListView
- ListView negro onScroll
- Cómo agregar tres niveles ListView en ExpandableListView en android
- Inverted ListView en Android?
- ListView con disposición de filas personalizada - Android
- Cómo hacer que las barras de desplazamiento de listview sean visibles todo el tiempo
- ListView - Barra de desplazamiento rápida no visible por primera vez en 4.4 Kitkat
Sí usted ha mencionado sobre setEmptyView () correctamente, usted debe utilizarlo si usted quisiera mostrar el mensaje vacío siempre que ListView consiga vacío.
Ahora aquí es un diseño xml y el código describe cómo usar setEmptyView exactamente.
<LinearLayout android:id="@+id/LinearLayout1" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/layoutTitlebar" > <ListView android:id="@+id/listViewFriends" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/friendBGColor" android:cacheColorHint="#00000000" > </ListView> <TextView android:id="@+id/empty" style="@android:style/TextAppearance.Large" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center" android:text="@string/strNoRecordsFound" > </TextView> </LinearLayout>
Ahora, usted tiene que establecer esta vista vacía (es decir, TextView) a ListView mediante:
ListView listViewFriends = (ListView) findViewById(R.id.listViewFriends); // set your adapter here // set your click listener here // or whatever else listViewFriends.setEmptyView(findViewById(R.id.empty));
Este método es todo lo que necesitas
Tener en cuenta que acepta una vista, por lo que tiene que inflar el diseño y llenar cualquier / todo el texto que puede tener allí por ti mismo.
EDITAR:
Supongamos que tiene un diseño llamado "empty_text" como este:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="There are no entries in this list" android:gravity="center"/> </LinearLayout>
Sugerencia: Me quemé en la cadena por propósitos de ejemplo, prestar atención a la advertencia de IDE y utilizar un identificador de cadena para el bien de I18n
Ahora usaría este código para hacer que todo funcionara con ListView:
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); View emptyTextView = inflater.inflate(R.layout.empty_text, null, false); listView.setEmptyView(emptyTextView);
Este código asume que se está ejecutando dentro de una Actividad, pero en caso de que no planifique pegarla en una Actividad, cualquier instancia de Contexto funcionará.
Eso debería ser.
ListView lv = (ListView)findViewById(android.R.id.list); TextView emptyText = (TextView)findViewById(android.R.id.empty); lv.setEmptyView(emptyText);
Entonces su listview utilizará automáticamente esta vista cuando su adaptador esté vacío.
Solución detallada:
Diseño:
<ListView android:id="@+id/listViewFriends" android:layout_height="match_parent" android:layout_width="match_parent" android:background="@color/friendBGColor" android:cacheColorHint="#00000000"> </ListView> <TextView android:id="@+id/empty" android:text="@string/strNoRecordsFound" android:layout_width="fill_parent" android:layout_height="fill_parent" style="@android:style/TextAppearance.Large" android:gravity="center"> </TextView> </LinearLayout>
Archivo de clase:
ListView listViewFriends = (ListView) findViewById(R.id.listViewFriends); listViewFriends.setEmptyView(findViewById(R.id.empty));
Fuente
- ¿Cómo puedo acceder a los recursos sin procesar en los proyectos de prueba de Android?
- Cómo usar rawQuery en android