2010-03-30 10 views
6

J'utilise 3 AutocompleteTextViews pour suggérer des entrées à partir d'une base de données. J'ai sous-classé AutocompleteTextView pour gérer la définition du texte par défaut à null lorsque l'on clique dessus et revenir aux instructions par défaut si on l'enlève et que rien n'est entré. J'utilisais un SimpleCursorAdapter pour lier à la vue, mais j'ai découvert qu'il était impossible d'obtenir l'ID de l'AutocompleteTextView à partir d'un OnItemClickListener, dont j'avais besoin pour mettre des informations supplémentaires de la ligne sélectionnée dans une variable en fonction sur lequel AutocompleteTextView venait. Tout ce que j'ai pu accéder était le AutoCompleteTextView $ DropDownListView, qui est une classe interne non documentée qui semble n'offrir aucune fonctionnalité réelle. Il n'y avait pas non plus de moyen de remonter la hiérarchie des vues pour obtenir l'AutocompleteTextView original. J'ai donc sous-classé SimpleCursorAdapter et ajouté un int au constructeur pour identifier l'AutocompleteTextView de l'adaptateur, et j'ai pu y accéder à partir de la vue passée dans OnItemClick(). Donc, bien que ma solution fonctionne bien, je me demande s'il est possible d'obtenir l'id d'un AutocompleteTextView à partir de son DropDownListView? J'utilise également une autre requête de base de données qui obtient l'identifiant de OnItemClick, puis recherche les données de cet élément, car je n'ai pas trouvé de moyen de convertir plus d'une colonne en chaîne. Dois-je utiliser CursorAdapter pour cela, pour enregistrer l'initialisation d'une autre requête? Oh, et une autre chose, ai-je besoin d'un curseur de base de données initialement (all_cursor) quand tout ce que je fais est en train de filtrer dessus pour obtenir un nouveau curseur? On dirait que c'est trop.

Activité ....

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(); 

classe Autocomplete:

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);} 
} 
} 
} 
} 

Adaptateur:

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; 
} 
    } 

désolé ya beaucoup de code! Merci de votre aide.

Stephen

Répondre

1

Au lieu d'utiliser this comme l'auditeur, créer une nouvelle classe d'auditeur et de lui donner votre autocomplete textview:

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

A pris un certain temps pour moi de revoir, mais il fonctionne. J'ai changé OnClickListener en OnItemClickListener, pour donner tous les détails d'enregistrement de DropDown. Merci beaucoup, je savais qu'il devait y avoir une réponse! –

Questions connexes