J'ai un ArrayAdapter (myAdapter) attaché à un composant AutoCompleteTextView (textView).
Une fois que l'utilisateur appuie sur un caractère, je voudrais remplir la liste déroulante de AutoCompleteTextView avec les éléments contenant ce caractère.
Je récupère les éléments en utilisant AsyncTask (qui utilise un service Web).Android, la fonction add() de ArrayAdapter ne fonctionne pas
J'appelle myAdapter.add (item) mais la liste déroulante est vide.
J'ai ajouté un appel à myAdapter.getCount() après chaque ajout et il affiche zéro à chaque fois. L'appel de notifyDataSetChanged() n'a pas aidé.
J'ai même essayé d'ajouter des objets String simples au lieu de mes objets personnalisés, en vain.
Qu'est-ce que je fais de mal?
Modifier: J'ai changé le code en miette suggéré ci-dessous mais toujours en vain.
Généralement, ce que je fais est après que le texte est changé dans ma vue de texte automatique complète, j'appelle un nouveau AsyncTask et lui passe le texte entré et un gestionnaire (voir afterTextChanged()). La tâche récupère les objets pertinents au texte et, une fois fait, le handleMessage() du Handler est appelé. Dans handleMessage(), j'essaie de remplir les objets de l'adaptateur. Mais la liste déroulante de l'adaptateur reste vide.
Voici mon code:
public class AddStockView extends Activity
implements OnClickListener, OnItemClickListener, TextWatcher {
ArrayAdapter<Stock> adapter;
AutoCompleteTextView textView;
Vector<Stock> stocks;
public AddStockView() {
// TODO Auto-generated constructor stub
stocks = new Vector<Stock>();
}
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.add_stock_view);
findViewById(R.id.abort_button).setOnClickListener(this);
adapter = new ArrayAdapter<Stock>(this,
android.R.layout.simple_dropdown_item_1line, stocks);
//adapter.setNotifyOnChange(true);
textView = (AutoCompleteTextView)
findViewById(R.id.search_edit_text);
textView.setAdapter(adapter);
textView.setOnItemClickListener(this);
textView.addTextChangedListener(this);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId())
{
case R.id.abort_button:
finish();
break;
case R.id.search_edit_text:
break;
}
}
@Override
public void onItemClick(AdapterView<?> parent, View v,
int position, long id) {
// TODO Auto-generated method stub
Stock stockToAdd = (Stock)parent.getAdapter().getItem(position);
//TODO: Add the above stock to user's stocks and close this screen
finish();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.layout.menu, menu);
CategoryMenu.getInstance().populateMenu(menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
CategoryMenu.getInstance().menuItemSelected(item, this);
return false;
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
return true;
}
@Override
public void afterTextChanged(Editable text) {
// TODO Auto-generated method stub
if (text.toString().equals(""))
return;
new AppTask().execute(new AppTask.Payload(Consts.taskType.SEARCH_STOCK,
new Object[] {text, handler}, this));
}
@Override
public void beforeTextChanged(CharSequence a0, int a1, int a2, int a3) {
// TODO Auto-generated method stub
}
@Override
public void onTextChanged(CharSequence a0, int a1, int a2, int a3) {
// TODO Auto-generated method stub
}
private void addStockItemsToAdapter(Vector<Object> dataItems)
{
for (int i = 0; i <dataItems.size(); i++)
{
Stock stk = (Stock)dataItems.elementAt(i);
stocks.add(stk);
}
}
public void populateAdapter()
{
addStockItemsToAdapter(ContentReader.getInstance.getDataItems());
adapter.notifyDataSetChanged();
int size = adapter.getCount(); // size == 0 STILL!!!!
textView.showDropDown();
}
final Handler handler = new Handler() {
public void handleMessage(Message msg) {
populateAdapter();
}
};
}
Merci beaucoup, Rob
Voici ce que je l'ai fait: je définissais un gestionnaire et le mettre dans mon AsyncTask (appelé AppTask) params comme ceci:
new AppTask().execute(new AppTask.Payload(Consts.taskType.SEARCH_STOCK, \t \t \t \t new Object[] {text, handler}, this));
Puis, dans handleMessage de mon Handler() J'ai appelé addItemsToAdapter . Comme pour les chaînes, j'ai déclaré ce tableau: privé static final String [] COUNTRIES = new String [] { "Belgique", "France", "Italie", "Allemagne", "Espagne" }; et au lieu d'appeler: myAdapter.add (tmpItem); J'ai appelé; myAdapter.add (COUNTRIES [i]) et même COUNTRIES [0]. Merci pour votre aide! – RobY at-il un moyen que je puisse publier l'intégralité du code? – Rob
Vous pouvez télécharger un zip projet minimaliste quelque part ou modifier votre question ci-dessus et ajouter le code là-bas ... – WarrenFaith