2011-04-27 46 views
12

Estoy desarrollando una aplicación para Android. Tengo mi actividad aquí con algunos widgets, incluido un Spinner. Quiero que el objeto Spinner se pueda buscar con el botón de búsqueda rápida. La idea es que el usuario toque el objeto Spinner y vea la lista (el adaptador). Si toca el botón de búsqueda rápida, se le debe proporcionar un campo de texto para ingresar una letra y luego la lista de referencias saltará a la primera palabra que encuentre con la letra suministrada. Del mismo modo que funciona con html y etiquetas de selección.Crear un filtro de texto (como la búsqueda rápida) para un Spinner en Android

me trataron Google (y así que por supuesto) pero parece que

  • nadie está interesado en una solución como ésta o
  • es un secreto muy bien guardado. :)

¿Tiene algunos consejos en este tema?

+1

¿Tiene alguna solución? –

+0

Bueno, tenía algún tipo de solución pero ahora estoy trabajando en otro lado y no puedo ver los repositorios. –

Respuesta

8

Parece que usted está hablando de una funcionalidad similar dada en AutoCompleteTextView

+0

Bueno, la aplicación está utilizando un objeto Spinner especial (extendido desde Spinner) que tiene pares clave-valor. Además, debe ser un menú desplegable, no un campo de texto de edición. No creo que funcione de esta manera. –

+1

@ AdamArold entonces, ¿cómo podría ser esta la respuesta aceptada? Los rotadores permiten la selección aunque no se haya introducido ningún valor de entrada. –

+0

Como puede ver, esta pregunta tiene 3 años. No uso Android durante 1 año, así que ya no es relevante. –

5

Se puede implementar por su cuenta propia.

Utilice un botón en lugar de una rueda giratoria, diseñe un cuadro de diálogo con un EditText para la entrada de consulta y un ListView para el contenido que desea visualizar. Luego filtre el contenido de ListView según el usuario que se ingrese en EditText.

filter(list, text); 
adapter.notifyDataSetChanged(); 
+1

nice solution dude –

+0

¡Esa es una solución realmente buena! No hay necesidad de 3ra biblioteca – Gabriel

6

Sé que esta pregunta es viejo, pero hoy yo también necesitaba esta función, y porque yo wasnt capaz de encontrar nada, me hice un adaptador para aquellos spinner

El adaptador:

public class Searchspinner extends ArrayAdapter<String> { 
    private LayoutInflater inflater; 
    private boolean dropdown = false; 
    private OnClickListener onsearch; 
    private ActionBar ab; 
    private final ArrayList<String> result = new ArrayList<String>(); 
    private InputMethodManager keyboard; 
    private boolean searching = false; 
    public Searchspinner(Context context, int resource, 
      ArrayList<String> objects, LayoutInflater l, ActionBar a, 
      InputMethodManager imm, String spinnerid) { 
     super(context, resource, objects); 
     inflater = l; 
     ab = a; 
     keyboard = imm; 
     createSearch(); 
     // TODO Auto-generated constructor stub 
    } 
    @Override 
    public View getDropDownView(int position, View cnvtView, ViewGroup prnt{ 
     dropdown = true; 
     return getCustomView(position, cnvtView, prnt); 
    } 
    @Override 
    public View getView(int pos, View cnvtView, ViewGroup prnt) { 
     dropdown = false; 
     return getCustomView(pos, cnvtView, prnt); 
    } 
    public View getCustomView(int position, View convertView, ViewGroup  parent) { 
     if (!dropdown) { 
      View mySpinner = inflater.inflate(
        R.layout.spinner_ressource_search, parent, false); 
      TextView main_text = (TextView) mySpinner 
        .findViewById(R.id.tv_spinner_first); 
      main_text.setText(getItem(position)); 
      ImageButton search = (ImageButton) mySpinner 
        .findViewById(R.id.searchbutton); 
      if (!searching) { 
       search.setImageResource(R.drawable.search); 
      } else { 
       search.setImageResource(R.drawable.search_check); 
      } 
      search.setOnClickListener(onsearch); 
      return mySpinner; 
     } 
     View mySpinner = inflater.inflate(R.layout.auftragtextview, parent, 
       false); 
     TextView sub_text = (TextView) mySpinner.findViewById(R.id.TextView01); 
     sub_text.setText(getItem(position)); 
     return mySpinner; 
    } 
    private void createSearch() { 
     onsearch = new OnClickListener() { 
      @Override 
      public void onClick(View v) {  
       // TODO Auto-generated method stub 
       if (searching) { 
        searching = false; 
        ab.setCustomView(R.layout.actionbar_layout); 
        ab.getCustomView().setTag("0"); 
        keyboard.toggleSoftInput(0, 
          InputMethodManager.HIDE_IMPLICIT_ONLY); 
        for (int i = 0; i < result.size(); i++) { 
         add(result.get(i)); 
         result.remove(i); 
         i--; 
        } 
        ((ImageButton) v).setImageResource(R.drawable.search); 
        return; 
       } 
       ((ImageButton) v).setImageResouce(R.drawable.search_check); 
       searching = true; 
       ab.setCustomView(R.layout.searchable); 
       final EditText et = (EditText) ab.getCustomView() 
         .findViewById(R.id.editText1); 
       et.setActivated(true); 
        keyboard.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 
         0); 
       et.requestFocus(); 
       et.addTextChangedListener(new TextWatcher() { 
        @Override 
        public void onTextChanged(CharSequence s, int start, 
          int before, int count) { 
         for (int i = 0; i < getCount(); i++) { 
          if (!getItem(i).contains(s)) { 
           result.add(getItem(i)); 
           remove(getItem(i)); 
           i--; 
          } 
         } 
         for (int i = 0; i < result.size(); i++) { 
          if (result.get(i).toLowerCase() 
             .contains(s.toString().toLowerCase())) { 
           add(result.get(i)); 
           result.remove(i); 
           i--; 
          } 
         } 
        } 
        @Override 
        public void beforeTextChanged(CharSequence s, 
          int start, int count, int after) { 
         // TODO Auto-generated method stub 
        } 
        @Override 
        public void afterTextChanged(Editable s) { 
         // TODO Auto-generated method stub 
        } 
       }); 
      } 
     }; 
    } 
} 

el spinner_ressource_search.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" > 

<TextView 
    android:id="@+id/tv_spinner_first" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentTop="true" 
    android:text="TextView" /> 

<ImageButton 
    android:id="@+id/searchbutton" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentRight="true" 
    android:layout_alignParentTop="true" 
    android:background="@android:color/transparent" 
    android:src="@drawable/search" /> 

</RelativeLayout> 

y la auftragtextview.xml:

<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/TextView01" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentTop="true" 
    android:text="@+d/TextView01" 
    android:textSize="16sp" > 
</TextView> 

y así es como se crea el adaptador:

Searchspinner auftragSpinnerAdapter = new Searchspinner(
    this.getApplicationContext(), 
    R.layout.auftragtextview, 
    list_auftragSpinner,getLayoutInflater(), 
    getActionBar(), 
    (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE) 
); 

espero que esto va a ayudar a nadie, y que no he echado de menos una ya construir en forma de hacerlo: D
saludos

Editar:

El searcheble.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    android:background="@drawable/actionbar_background_beosys" > 
<EditText 
    android:id="@+id/editText1" 
    android:hint="@string/suche" 
    android:layout_width="fill_parent" 
    android:layout_height="40dp" 
    android:layout_marginLeft="15dp" 
    android:paddingLeft="15dp" 
    android:paddingRight="15dp" 
    android:layout_marginRight="15dp" 
    android:singleLine="true" 
    /> 

Así que la EditText1 es sólo un EDITTEXT simple en la opinión de que get's en la barra de acción cuando se busca.

ActionbarLayout es la ActionbarView normal.

+0

¿Cuáles son los elementos 'searchable',' actionbar_layout' y 'editText1'? – ShahiM

+1

Editet the Answer – glm9637

+3

actionbar_layout aún no está definido en la respuesta –

Cuestiones relacionadas