Ho un ArrayAdapter (myAdapter) collegato a un componente AutoCompleteTextView (textView).
Una volta che l'utente preme un carattere, desidero popolare l'elenco a discesa di AutoCompleteTextView con gli elementi che contengono questo carattere.
Recupero gli elementi utilizzando AsyncTask (che utilizza un servizio Web).Android, funzione add() di ArrayAdapter non funzionante
Ho chiamato myAdapter.add (elemento) ma l'elenco a discesa è vuoto.
Ho aggiunto una chiamata myAdapter.getCount() dopo ogni aggiunta e mostra zero ogni volta. La chiamata a notifyDataSetChanged() non ha aiutato.
Ho persino provato ad aggiungere semplici oggetti String invece dei miei oggetti personalizzati, inutilmente.
Cosa sto sbagliando?
Modifica: Ho cambiato il codice come miette suggerito di seguito, ma ancora inutilmente.
Generalmente, quello che faccio è dopo che il testo è stato modificato nella mia vista testo completa automatica, chiamo un nuovo AsyncTask e gli passo il testo inserito e un gestore (vedi afterTextChanged()). L'attività recupera oggetti rilevanti per il testo e una volta fatto viene chiamato handleMessage() del gestore. In handleMessage() tento di popolare gli oggetti dell'adattatore. Ma ancora l'elenco a discesa dell'adattatore finisce vuoto.
Ecco il mio codice:
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();
}
};
}
Grazie mille, Rob
Ecco quello che ho fatto: ho definito un Handler e mettila nel mio AsyncTask (chiamato AppTask) params in questo modo:
new AppTask().execute(new AppTask.Payload(Consts.taskType.SEARCH_STOCK, \t \t \t \t new Object[] {text, handler}, this));
Poi, in handleMessage di mia Handler() ho chiamato addItemsToAdapter . Per quanto riguarda le corde, ho dichiarato questa matrice: private static final String [] PAESI = new String [] { "Belgio", "Francia", "Italia", "Germania", "Spain" }; e invece di chiamare: myAdapter.add (tmpItem); Ho chiamato; myAdapter.add (COUNTRIES [i]) e persino COUNTRIES [0]. Grazie per il vostro aiuto! – RobC'è un modo per pubblicare l'intero codice? – Rob
Puoi caricare da qualche parte un progetto minimalista o modificare la tua domanda e aggiungere il codice ... – WarrenFaith