2010-03-30 33 views
6

Estoy utilizando 3 AutocompleteTextViews para sugerir entradas de una base de datos. He subclasificado AutocompleteTextView para manejar la configuración del texto predeterminado como nulo cuando se hace clic y volver a las instrucciones predeterminadas si se lo aleja y no se ingresa nada.

Estaba usando un SimpleCursorAdapter para enlazar a la vista, pero descubrí que no había forma de que pudiera obtener el id del AutocompleteTextView de un OnItemClickListener, que necesitaba para poner información adicional de la fila seleccionada en una variable dependiendo de qué AutocompleteTextView era. Todo lo que pude acceder fue AutoCompleteTextView $ DropDownListView, que es una clase interna no documentada que parece no ofrecer ninguna funcionalidad real. Tampoco había una forma de subir la jerarquía de vistas para obtener el AutocompleteTextView original.

Subclasé SimpleCursorAdapter y agregué un int al constructor para identificar de qué AutocompleteTextView era el adaptador, y pude acceder a esto desde la vista pasada a OnItemClick(). Entonces, aunque mi solución funciona bien, me pregunto si es posible obtener el ID de un AutocompleteTextView desde su DropDownListView?

También estoy usando otra consulta de base de datos que obtiene el id del OnItemClick y luego busca los datos para ese elemento, porque no pude encontrar una forma de convertir más de una columna en una cadena. ¿Debo usar CursorAdapter para esto, para guardar iniciando otra consulta? Ah, y otra cosa, ¿necesito un cursor de base de datos inicialmente (all_cursor) cuando todo lo que estoy haciendo es filtrar en él para obtener un nuevo cursor? Parece un exceso.

Actividad ....

clase
dbse.openDataBase(); 
    Cursor all_Cursor = dbse.autocomplete_query(); 
    startManagingCursor(all_Cursor); 
    String[] from_all = new String[]{DbAdapter.KEY_NAME}; 
    int[] to_all = new int[] {android.R.id.text1}; 
    from_adapt = new AutocompleteAdapter(FROM_DBADAPTER, this,android.R.layout.simple_dropdown_item_1line, all_Cursor, from_all, to_all); 
    from_adapt.setStringConversionColumn(1); 
    from_adapt.setFilterQueryProvider(this); 
    to_adapt = new AutocompleteAdapter(TO_DBADAPTER, this,android.R.layout.simple_dropdown_item_1line, all_Cursor, from_all, to_all); 
    to_adapt.setStringConversionColumn(1); 
    to_adapt.setFilterQueryProvider(this); 
from_auto_complete = (Autocomplete) findViewById(R.id.entry_from); 
from_auto_complete.setAdapter(from_adapt); 
from_auto_complete.setOnItemClickListener(this); 

to_auto_complete = (Autocomplete) findViewById(R.id.entry_to); 
to_auto_complete.setAdapter(to_adapt); 
to_auto_complete.setOnItemClickListener(this); 

public void onItemClick (AdapterView<?> parent, View view, int position, long id) { 
    Cursor selected_row_cursor = dbse.data_from_id(id); 
    selected_row_cursor.moveToFirst(); 
    String lat = selected_row_cursor.getString(1); 
    String lon = selected_row_cursor.getString(2); 
    int source = ((AutocompleteAdapter) parent.getAdapter()).getSource(); 

Autocompletar:

public class Autocomplete extends AutoCompleteTextView implements OnTouchListener,OnFocusChangeListener{ 

String textcontent; 
Context mycontext = null; 
int viewid = this.getId(); 

public Autocomplete(Context context, AttributeSet attrs) { 
super(context, attrs); 
textcontent = this.getText().toString(); 
mycontext = context; 
this.setOnFocusChangeListener(this);  
this.setOnTouchListener(this); 
} 
public boolean onTouch(View v, MotionEvent event) { 
if (textcontent.equals(mycontext.getString(R.string.from_textbox)) | 
textcontent.equals(mycontext.getString(R.string.to_textbox)) | 
textcontent.equals(mycontext.getString(R.string.via_textbox))) { 
this.setText(""); 
} 
return false; 
} 
public void onFocusChange(View v, boolean hasFocus) { 
if (hasFocus == false) { 
int a = this.getText().length(); 
if (a == 0){ 
if (viewid == R.id.entry_from) {this.setText(R.string.from_textbox);} 
if (viewid == R.id.entry_to) {this.setText(R.string.to_textbox);} 
if (viewid == R.id.entry_via) {this.setText(R.string.via_textbox);} 
} 
} 
} 
} 

adaptador:

public class AutocompleteAdapter extends SimpleCursorAdapter { 
int source; 
public AutocompleteAdapter(int query_source, Context context, int layout, Cursor c, 
     String[] from, int[] to) { 
    super(context, layout, c, from, to); 
    source = query_source; 
} 
public int getSource() { 
    return source; 
} 
    } 

siento que es una gran cantidad de código! Gracias por tu ayuda.

Stephen

Respuesta

1

En lugar de utilizar this como el oyente, crear una nueva clase de escucha y darle su TextView autocompletar:

public class MyActivity extends Activity { 

    // .... somewhere 
    from_auto_complete.setOnItemClickListener(new MyClickListener(from_auto_complete)); 

    private class MyClickListener implements OnClickListener { 
     AutoCompleteTextView autoComplete; 
     MyClickListener(AutoCompleteTextView actv) { 
      autoComplete = actv; 
     } 
     // ... handle clicks 
    } 
} 
+0

tomó un tiempo para que repase esto, pero funciona. Cambié OnClickListener a OnItemClickListener, para dar todos los detalles del registro del DropDown. Muchas gracias, ¡sabía que tenía que haber una respuesta! –

Cuestiones relacionadas