lunes, 1 de septiembre de 2014

Simple SearchView con Xamarin.Android

Hola buen día,

El día de hoy les traigo un ejemplo de como crear un  SearchView  para buscar items dentro de un ListView.

Primero vamos a crear una nuevo proyecto del tipo "Android Application".


Despues de crear nuestro proyecto vamos a la carpeta de componentes donde añadiremos el componente de "Android Support Library v7 AppCompat"

Ahora vamos a comenzar una carpeta llamada Menu dentro de la carpeta Resources, y dentro de la carpeta Menu creamos un archivo llamado main.xml con el siguiente codigo.





Ahora vamos con nuestro layout principal que es el que muestra nuestro Search Bar y el ListView con los items donde realizaremos la busqueda.

    

Después vamos a  nuestro MainActivity.cs, primero cambiamos el tipo de la clase de "Activity" a  "ActionBarActivity".
using Android.App;
using Android.Runtime;
using Android.Support.V4.View;
using Android.Support.V7.App;
using Android.Support.V7.Widget;
using Android.Views;
using Android.OS;
using Android.Widget;

namespace SearchBar
{
 [Activity(Label = "SearchView Ejemplo", MainLauncher = true, Icon = "@drawable/icon",
  Theme = "@style/Theme.AppCompat.Light")]
 public class SearchViewActivity : ActionBarActivity
 {
  private Android.Support.V7.Widget.SearchView _searchView;
  private ListView _listView;
  private ArrayAdapter _adapter;

  protected override void OnCreate(Bundle bundle)
  {
   base.OnCreate(bundle);

   // Set our view from the "main" layout resource
   SetContentView(Resource.Layout.Main);

   var Names = new[]
   {
    "Ricardo Romo Gonzalez","Alejandro Ruiz Varela","Christian Salvador Arenas",
    "Armando Balleza","Jorge Vazquez","Enrique Torres","Angel Alberto Mejia","Juan Manuel Perez",
    "Ruben Perez","Pedro Navajas","Jose Alfredo Jimenez","Antonio Aguilar"
   };

   _listView = FindViewById(Resource.Id.listView);
   _adapter = new ArrayAdapter(this, Android.Resource.Layout.SimpleListItem1, Names);
   _listView.Adapter = _adapter;
  }

  public override bool OnCreateOptionsMenu(IMenu menu)
  {
   MenuInflater.Inflate(Resource.Menu.main, menu);

   var item = menu.FindItem(Resource.Id.action_search);
   MenuItemCompat.SetOnActionExpandListener(item, new SearchViewExpandListener(_adapter));

   var searchItem = MenuItemCompat.GetActionView(item);
   _searchView = searchItem.JavaCast();

   _searchView.QueryTextChange += (s, e) => _adapter.Filter.InvokeFilter(e.NewText);

   _searchView.QueryTextSubmit += (s, e) =>
   {
    //TODO: Do something fancy when search button on keyboard is pressed
    Toast.MakeText(this, "Searched for: " + e.Query, ToastLength.Short).Show();
    e.Handled = true;
   };

   return true;
  }
 }
}
Creamos una nueva clase llamada "SearchViewExpandListener" implementado "IOnActionExpandListener" para poder expandir o contrar cuando se realiza una busqueda.

using System;
using Android.Support.V4.View;
using Android.Widget;
using Android.Views;

namespace SearchBar
{
 public class SearchViewExpandListener
  : Java.Lang.Object, MenuItemCompat.IOnActionExpandListener
 {
  private readonly IFilterable _adapter;

  public SearchViewExpandListener(IFilterable adapter)
  {
   _adapter = adapter;
  }

  public bool OnMenuItemActionCollapse(IMenuItem item)
  {
   _adapter.Filter.InvokeFilter("");
   return true;
  }

  public bool OnMenuItemActionExpand(IMenuItem item)
  {
   return true;
  }
 }
}

Después de realizar los pasos anteriores corremos nuestro proyecto y deber aparecer como a continuación.






Esto fue un pequeño ejemplo de como utilizar el SearchView en Xamarin.Android espero que le ayude cualquier cosa deja un comentario.

Gracias.
Puedes descargar el proyecto desde mi github :SearchBar