2011-08-14 13 views
20

Tengo este código. Cuando elijo un elemento de la lista de sugerencias, el cambio de texto ocurre primero, luego viene oItemClicked después de eso. Ahora quiero elegir una palabra, el "onItemClicked" aparece primero, luego "onTextChanged". Eché un vistazo al documento de Android pero no menciona este tema.Cómo evitar llamar tanto: onItemClicked y onTextChanged en AutoCompleteTextView

package com.autocompletetest; 


import java.util.Arrays; 
import java.util.List; 

import android.app.Activity; 
import android.os.Bundle; 
import android.text.Editable; 
import android.text.TextWatcher; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.ArrayAdapter; 
import android.widget.AutoCompleteTextView; 

public class OnItemClickAndOnTextChangedActivity extends Activity implements TextWatcher, OnItemClickListener { 
    private AutoCompleteTextView textView; 

    private static final String[] TEMP = new String[] { 
     "Beep", "Belgium", "Best", "Bubble", "Bye" 
    }; 
    @Override 
    protected void onCreate(final Bundle icicle) { 
     super.onCreate(icicle); 
     setContentView(R.layout.main); 

     textView = (AutoCompleteTextView)findViewById(R.id.autoCompleteTextView1); 
     textView.setOnItemClickListener(this); 
     textView.addTextChangedListener(this); 
     textView.setThreshold(1); 

     final List<String> list = Arrays.asList(TEMP); 

     final ArrayAdapter<String> adapter = new ArrayAdapter<String>(
       OnItemClickAndOnTextChangedActivity.this, 
       android.R.layout.simple_dropdown_item_1line, list); 
     textView.setAdapter(adapter); 
    } 

    @Override 
    public void onTextChanged(final CharSequence s, final int start, final int before, final int count) { 
     System.out.println("OnTextChanged."); 
    } 

    @Override 
    public void onItemClick(final AdapterView<?> parent, final View view, final int position, final long id) { 
     System.out.println("OnItemClick."); 
    } 

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

    @Override 
    public void afterTextChanged(final Editable s) { 

    } 

} 

Actualización: En detalle, esto es lo real lo que quiero hacer. Algo no está relacionado con el título de la pregunta.

package com.autocompletetest; 


import java.util.Arrays; 
import java.util.List; 

import android.app.Activity; 
import android.os.Bundle; 
import android.text.Editable; 
import android.text.TextWatcher; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.ArrayAdapter; 
import android.widget.AutoCompleteTextView; 

public class OnItemClickAndOnTextChangedActivity extends Activity implements TextWatcher, OnItemClickListener { 
    private AutoCompleteTextView textView; 
    private boolean itemClicked; 

    private static final String[] TEMP = new String[] { 
     "Beep", "Belgium", "Best", "Bubble", "Bye" 
    }; 
    @Override 
    protected void onCreate(final Bundle icicle) { 
     super.onCreate(icicle); 
     setContentView(R.layout.main); 

     textView = (AutoCompleteTextView)findViewById(R.id.autoCompleteTextView1); 
     textView.setOnItemClickListener(this); 
     textView.addTextChangedListener(this); 
     textView.setThreshold(1); 

     final List<String> list = Arrays.asList(TEMP); 

     final ArrayAdapter<String> adapter = new ArrayAdapter<String>(
       OnItemClickAndOnTextChangedActivity.this, 
       android.R.layout.simple_dropdown_item_1line, list); 
     textView.setAdapter(adapter); 
    } 

    @Override 
    public void onTextChanged(final CharSequence s, final int start, final int before, final int count) { 
     System.out.println("OnTextChanged."); 

     // The below code block does: 
     // When type a word, make a new ArrayAdapter and set it for textView 
     // If any of word in suggestion list is clicked, nothing changes, dropdown list not shown. 
     if(itemClicked) { 
      itemClicked = false; 
     } else { 
      // Create new ArrayAdapter. 
      // textView is set to new ArrayAdapter. 
      // textView.showDropDown() 
     } 
    } 

    @Override 
    public void onItemClick(final AdapterView<?> parent, final View view, final int position, final long id) { 
     System.out.println("OnItemClick."); 
     itemClicked = true; 
    } 

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

    @Override 
    public void afterTextChanged(final Editable s) { 

    } 
} 
+0

¿comprobé cuándo 'beforeTextChanged()' llamó.? – Ronnie

+0

¿Por qué no puedes hacer todas las cosas en OnclickListener()? – Ronnie

+0

Sí, lo hice. TODAS las funciones de TextWatcher ocurren antes de OnItemClick. – Emerald214

Respuesta

75

isPerformingCompletion() de la API de nivel 3. Devuelve cierto después de que un artículo ha sido seleccionado de la lista desplegable y TextWatcher oyentes están a punto de ser disparado. En resumen, para evitar el comportamiento descrito:

public void onTextChanged(CharSequence s, int start, int before, int count) { 
    if (autoCompleteView.isPerformingCompletion()) { 
     // An item has been selected from the list. Ignore. 
     return; 
    } 

    // Your code for a general case 
} 
+0

¡gracias, exactamente lo que estaba buscando! – Marco

+0

trabajando perfectamente! gracias, Neek! – Scit

+0

Agradable, gracias – Imotep

0

No hay ninguna solución concreta para este problem.I sugerirá que usted debe poner el código en el que se encuentra en el interior OnClickListener() en el inicio de textchangedlistener() para que el código que u desea conseguir ejecutar primero se ejecutará primero y luego se ejecutará el código que desea ejecutar el último. Espero que esto lo ayude. se añadió

+0

En realidad tengo una variable booleana "itemClicked", será verdadera cuando haga clic en un elemento en la lista de sugerencias. Quiero verificar "itemClicked" cada vez que cambia el texto. El problema es ... después de hacer clic en una palabra, aparece OnTextChanged antes de onItemClicked. – Emerald214

+0

Puede hacer una cosa. Como dije, hay una solución en particular, ya que se llamará primero a textchange. Así que coloca el código que está dentro de textChangedListener() dentro de una función y llama a esa función al final de onItemClicked(). trabajo, creo. –

Cuestiones relacionadas