5

Tengo un ListView y un EditText. Implemento addTextChangedListener en EditText a filtro contenido ListView.Cómo mostrar "Sin resultados" en ListView filtrable?

leftList.setTextFilterEnabled(true); 
et_search.addTextChangedListener(filterTextWatcher); 

y luego el TextWatcher es:

private TextWatcher filterTextWatcher = new TextWatcher() { 

    public void afterTextChanged(Editable s) { 
    } 

    public void beforeTextChanged(CharSequence s, int start, int count, 
      int after) { 
    } 

    public void onTextChanged(CharSequence s, int start, int before, 
      int count) { 

     if (watcherAdapter==null) { 
      return; 
     } 

     watcherAdapter.getFilter().filter(s); 

     Log.e(TAG, "OnTextChange: " + s + " start: " + start + 
     " before: " + before + " count: " + count + " adapter: " + 
     watcherAdapter.getCount());  

    } 
}; 

Estado:

  1. tengo 10 artículos en ListView.

Pregunta:

  1. La primera vez que escribe el primer carácter, ¿por qué los rendimientos watcherAdapter.getCount()10 (como inicial) en ListVie w en lugar del resultado devuelto filtro cuentan? El watcherAdapter.getCount() parece a-clic tarde para el resultado mostrado en ListView.
  2. ¿Cómo logro mostrar "No Result" en ListView cuando no hay resultados de coincidencia mientras escribo en el EditText?
+0

La única solución que utilizo al fin es hacer mi filtro de búsqueda personalizada .... Dividir las palabras, ellos tokenizes, y si se hace corresponder ponerlo en matriz como adaptador a la lista. Y funciona como yo quiero. – rxlky

Respuesta

0

La única solución que uso al fin es hacer mi filtro de búsqueda personalizado ... Divida las palabras, las tokenizes, y si coinciden, colóquelas en una matriz como adaptador a la Lista. Y funciona como yo quiero que

1
if(!fillMaps.isEmpty()) 
      { 
      SimpleAdapter adapter = new SimpleAdapter(
        WorldClockActivity.this, fillMaps, R.layout.grid_item, 
        from, to); 
      lv1.setAdapter(adapter); 
      } 
      else 
      {  String[] emptyList = new String[] {"No record found"}; 
      lv1.setAdapter(new ArrayAdapter<String>(WorldClockActivity.this,R.layout.list_item, emptyList)); 
      } 

debe utilizar dos adaptador para hacer esto en el código anterior que tengo uso de dos adaptador primero se establece cuando nos encontramos elemento en el mapa si el mapa está vacía, entonces se debe añadir otro adaptador he puesto en otra condición. Lo he hecho y está funcionando bien. Espero que tenga su solución.

+0

Realmente no lo entiendo. ¿Pusiste esto en TextChanged? Supongo que fillMaps en su caso también es un clic tarde ¿no? – rxlky

1

Es más limpio para agregar un TextView a su disposición, por encima o por debajo de la lista, donde se muestra el mensaje:

<TextView 
android:id="@+id/noResultsFoundView" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:text="No result" 
android:visibility="gone" 
/> 

Cuando tenga resultados, establecer la visibilidad de IDO. Cuando no tiene resultados, lo establece en VISIBLE.

Para escuchar Para este propósito puede aplicar un filtro personalizado o al menos reemplazar el método

publishResults(CharSequence constraint, FilterResults results) 

del filtro, en el que, recuento actualizado correcta se pasa en el parámetro FilterResults.

En publishResults se llama a un método de la actividad para actualizar la visibilidad de noResultsFoundView. Cómo accedes a la actividad depende de dónde está tu filtro. Si está en una clase interna de la actividad, entonces es fácil. De lo contrario, por ejemplo, pasará la actividad como parámetro para instanciar el adaptador y almacenarlo como variable de intancia.

1

Por supuesto, es posible mostrar ningún resultado en la lista filtrable. Por favor refere el código de abajo

@Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
     super.onCreateOptionsMenu(menu, inflater); 
     inflater.inflate(R.menu.home, menu); 

     MenuItem searchItem = menu.findItem(R.id.menu_search); 
     final AppCompatEditText searchView = (AppCompatEditText) MenuItemCompat.getActionView(searchItem); 
     if (searchView != null) { 
      searchView.addTextChangedListener(new TextWatcher() { 

       @Override 
       public void onTextChanged(CharSequence arg0, int arg1, int arg2, 
              int arg3) { 
        if(mAdapter==null) 
         return; 
         mAdapter.getFilter().filter(arg0.toString()); 
         if(mAdapter.getItemCount()<1){ 
          listView.setVisibility(View.GONE); 
          txtEmptyList.setVisibility(View.VISIBLE); 
         }else{ 
          listView.setVisibility(View.VISIBLE); 
          txtEmptyList.setVisibility(View.GONE); 
         } 
       } 

       @Override 
       public void beforeTextChanged(CharSequence arg0, int arg1, 
               int arg2, int arg3) { 
       } 

       @Override 
       public void afterTextChanged(Editable arg0) { 

       } 
      }); 
     } 
     MenuItemCompat.setOnActionExpandListener(searchItem, this); 
     MenuItemCompat.setActionView(searchItem, searchView); 
     super.onCreateOptionsMenu(menu, inflater); 
    } 
Cuestiones relacionadas