2012-10-16 9 views
13

Il mio codice attività principale:AutoCompleteTextView non mostra discesa quando si preme lo spazio dopo aver digitato una parola completa

// here you put all your data. 
String[] dataArray = { "Amit sharma Kumar", "Hisham Kumar Munner", 
     "Vineet John Chaturvedi", "Lucky Kumar Verma" }; 

ArrayList<String> alAutoCompleteList; 
AutoCompleteTextView acTV; 
ArrayAdapter<String> adapter1; 

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

    // etAuto = (EditText) findViewById(R.id.etAuto); 
    acTV = (AutoCompleteTextView) findViewById(R.id.acTV); 
    // Arraylist 
    alAutoCompleteList = new ArrayList<String>(); 
    adapter1 = new ArrayAdapter<String>(MainActivity.this, 
      android.R.layout.simple_dropdown_item_1line,  alAutoCompleteList); 


    acTV.addTextChangedListener(new TextWatcher() { 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, 
       int count) { 
      // TODO Auto-generated method stub 
      if (acTV.enoughToFilter()) { 
       acTV.showDropDown(); 
       acTV.bringToFront(); 
      } 
     } 

     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, 
       int after) { 
      // TODO Auto-generated method stub 
      alAutoCompleteList.clear(); 
     } 

     @Override 
     public void afterTextChanged(Editable s) { 
      // TODO Auto-generated method stub 

      String acText = acTV.getText().toString().trim(); 

      for (String item : dataArray) { 

       if  (item.toLowerCase().contains(acText.toLowerCase())) { 
        alAutoCompleteList.add(item); 
       } 
      } 


      acTV.setThreshold(4); 
      acTV.setAdapter(adapter1); 
      acTV.showDropDown(); 

     } 
    }); 

Quando cerco "Sharma" e si preme uno spazio dopo che i suggerimenti si spengono . Voglio che quei suggerimenti restino lì. Ho provato a fare tutto ma non ho avuto alcun successo. Qualcuno può aiutarmi per favore?

Modifica: Qualcuno può provare questo codice sui propri emulatori? Basta aggiungere uno AutoCompleteTextView in xml ed eseguirlo.

risposta

14

Innanzitutto, esiste un motivo per cui è stato impostato il listener TextWatcher su AutoCompleteTextView? Se lo hai fatto per filtrare i dati da solo, non dovresti farlo (perché il widget lo fa per impostazione predefinita e il tuo codice non è corretto).

Quando eseguo una ricerca su "sharma", premo uno spazio dopo. suggerimenti va off. Voglio che quei suggerimenti restino lì.

Questo accade a causa della scheda e la Filter implementazione predefinita che viene con esso, elementi che il AutoCompleteTextView usa le sotto il cofano per fornire i valori che si vedono in discesa. Il comportamento predefinito per un ArrayAdapter è quello che vedi, puoi trovare una spiegazione in this answer. La soluzione è implementare il proprio adattatore con un filtro che cercherà i dati di riga dell'intero adattatore per la stringa del filtro. Ho preso il codice della classe ArrayAdapter dall'SDK e ho apportato una leggera modifica in modo che il filtro non si interrompa quando si inserisce uno spazio dopo una parola. È possibile trovare la classe here in quanto il codice è troppo grande per la pubblicazione. Basta copiare la classe nel progetto e usarlo come un normale ArrayAdapter:

FilterWithSpaceAdapter<String> adapter1; 
//... 
adapter1 = new FilterWithSpaceAdapter<String>(MainActivity.this, 
      android.R.layout.simple_dropdown_item_1line, dataArray); 
+1

Questa soluzione non funziona. Se scrivi uno spazio vuoto, disattiva i suggerimenti a discesa. – cnbandicoot

+0

@cnbandicoot Per favore, fai una nuova domanda fornendo maggiori dettagli su quello che stai facendo. – Luksprog

0

Penso che ci siano problemi in watcher testo perché vista completamento automatico del testo non ha bisogno di watcher testo perché quell'evento auto ascoltatore. devi semplicemente passare la tua matrice alla scheda invece che alla lista. alAutoCompleteList non ci sono valori nella lista. non hai mai aggiunto valore nell'elenco.

  • sia quello che dovete fare come: alAutoCompleteList.add ("Dati uno"); alAutoCompleteList.add ("data two");

  • o passare dataArray all'adattatore. adapter1 = new ArrayAdapter (MainActivity.this, android.R.layout.simple_dropdown_item_1line, dataArray);

  • Non è necessario utilizzare l'osservatore del testo.

1

Non è necessario un TextWatcher, AutoCompleteTextView utilizza il filtro dell'adapter impostato. L'adattatore predefinito filtra le voci chiamando toString() su di esse. Naturalmente, se l'utente inserisce uno spazio, i valori non corrispondono più. Per implementare questo comportamento personalizzato non devi aggiungere un visualizzatore di testo ma creare un adattatore personalizzato. È ancora possibile estendere ArrayAdapter o SimpleAdapter. Implementa il tuo comportamento di filtro personalizzato (nel tuo caso una chiamata trim()) sovrascrivendo getFilter() e publishResults(). Here o here puoi trovare esempi su come farlo.

2

Prima di tutto, non è necessario TextWatcher con AutoCompleteTextView perché AutoCompleteTextView ha il proprio metodo per vedere il testo cioè MyWatcher. È necessario utilizzare:

setThreshold(3); 
final String[] AndroidDesk= getResources().getStringArray(R.array.clothname_arrays); 
ArrayAdapter<String> My_arr_adapter= new ArrayAdapter<String>(getApplicationContext(), 
      android.R.layout.simple_dropdown_item_1line,AndroidDesk);  
    cloths.setThreshold(1); 
    cloths.setAdapter(My_arr_adapter); 
    cloths.setOnItemClickListener(new OnItemClickListener() { 
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {        
    } 
    }); 
Problemi correlati