2011-10-27 33 views
17

me estaba siguiendo este ejemplo:Ejecución Autocompletar con ListView en Android

http://developer.android.com/resources/tutorials/views/hello-autocomplete.html

Y yo quiero saber cómo puedo aplicar esto con un ListView en lugar de la ventana desplegable que se suministra con este TextView.

Por ejemplo, a medida que el usuario escribe en textView, hay un ListView directamente debajo del textView que cambiará constantemente a medida que el usuario escribe en el campo textView.

EDIT: Aquí está la solución que estará con gracias a Josefo:

package com.jaylefler.contacts; 

import java.util.ArrayList; 

import android.app.Activity; 
import android.os.Bundle; 
import android.text.Editable; 
import android.text.TextWatcher; 
import android.widget.ArrayAdapter; 
import android.widget.EditText; 
import android.widget.ListView; 

public class ContactProjectActivity extends Activity { 
    /** Called when the activity is first created. */ 

    // List of all contacts 
    private ArrayList<String> searchNames = new ArrayList<String>(); 
    // Filtered list of contacts after user begins typing in search field 
    private ArrayList<String> partialNames = new ArrayList<String>(); 

    // List of names matching criteria are listed here 
    private ListView myList; 

    // Field where user enters his search criteria 
    private EditText nameCapture; 

    // Adapter for myList 
    private ArrayAdapter<String> adapter; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     // Set list adapter 
     myList = (ListView) findViewById(R.id.names); 
     adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, partialNames); 
     myList.setAdapter(adapter); 

     searchNames.add("Tom Arnold"); 
     searchNames.add("Zeb Arnold"); 
     searchNames.add("Dan Bateman"); 
     searchNames.add("Tommy Canders"); 
     searchNames.add("Elijah Arnman"); 
     searchNames.add("Tomas Muster"); 
     searchNames.add("Stefan Edberg"); 
     searchNames.add("Ivan Lendl"); 


     nameCapture = (EditText) findViewById(R.id.name); 
     nameCapture.setText("Tom"); 

     AlterAdapter(); 

     nameCapture.addTextChangedListener(new TextWatcher() { 

      // As the user types in the search field, the list is 
      @Override 
      public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { 
       AlterAdapter(); 
      } 

      // Not used for this program 
      @Override 
      public void afterTextChanged(Editable arg0) { 

      } 

      // Not uses for this program 
      @Override 
      public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { 
       // TODO Auto-generated method stub 

      } 
     }); 
    } 

    // Filters list of contacts based on user search criteria. If no information is filled in, contact list will be blank. 
    private void AlterAdapter() { 
     if (nameCapture.getText().toString().isEmpty()) { 
      partialNames.clear(); 
      adapter.notifyDataSetChanged(); 
     } 
     else { 
      partialNames.clear(); 
      for (int i = 0; i < searchNames.size(); i++) { 
       if (searchNames.get(i).toString().toUpperCase().contains(nameCapture.getText().toString().toUpperCase())) { 
        partialNames.add(searchNames.get(i).toString()); 
       } 
       adapter.notifyDataSetChanged(); 
      } 
     } 
    } 
} 
+0

Filtra tu matriz y muéstrala refrescándola. – doNotCheckMyBlog

+0

Aquí vamos a ayudar: http://stackoverflow.com/questions/1645209/how-can-i-filter-listview-data-when-typing-on-edittext-in-android – doNotCheckMyBlog

+0

Esto funcionó muy bien. Gracias por publicar la solución final. – SilentNot

Respuesta

7
<yourEditText>.addTextChangedListener(new TextWatcher() { 

      @Override 
      public void onTextChanged(CharSequence s, int start, int before, int count) { 
      <requery/filter your adapter then set it to your listview> 
      } 

      @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 

      } 
     }); 
+0

Cuando dices "requery/filter" mi adaptador, no entiendo lo que tengo que hacer. –

+1

modifique la matriz/cursor que está alimentando su adaptador, luego llame a adapter.notifyDataSetChanged(). los cambios deben reflejarse en su listaView. – josephus

+0

¿Esta demora en la repoblación de la matriz evitará que la "Autocompletar" aparezca instantáneamente? –

3

Al filtrar el adaptador dentro del método onTextChanged(), algo que podría hacer en vez de filtrar a sí mismo es:

adapter.getFilter().filter("search text"). 

Supongo que su enfoque podría ser bastante lento con una gran lista.