Tengo un ArrayAdapter (myAdapter) conectado a un componente AutoCompleteTextView (textView).
Una vez que el usuario presione un carácter, me gustaría completar la lista desplegable de AutoCompleteTextView con los elementos que contienen este carácter.
Recupero los elementos usando AsyncTask (que usa un servicio web).Android, la función add() de ArrayAdapter no funciona
Llamo a myAdapter.add (artículo) pero la lista desplegable está vacía.
Agregué una llamada myAdapter.getCount() después de cada adición y muestra cero cada vez. Llamar notifyDataSetChanged() no ayudó.
Incluso traté de agregar objetos String simples en lugar de mis objetos personalizados, fue en vano.
¿Qué estoy haciendo mal?
Edit: He cambiado el código como miette se sugiere a continuación, pero aún así fue en vano.
Generalmente, lo que hago es después de que el texto se cambia en mi vista de texto completa automática, llamo a una nueva AsyncTask y le paso el texto ingresado y un Manejador (vea afterTextChanged()). La tarea recupera objetos relevantes para el texto y una vez hecho esto se llama a handleMessage(). En handleMessage() intento llenar los objetos del adaptador. Pero aún la lista desplegable del adaptador termina vacía.
Aquí está mi código:
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();
}
};
}
Muchas gracias, Rob
Aquí es lo que hice: He definido una Handler y la puso en mi AsyncTask (llamado AppTask) params así:
new AppTask().execute(new AppTask.Payload(Consts.taskType.SEARCH_STOCK, \t \t \t \t new Object[] {text, handler}, this));
Luego, en handleMessage de mi Handler() Llamé addItemsToAdapter . En cuanto a las cadenas, he declarado esta matriz: privada estática final Cadena [] COUNTRIES = new String [] { "Bélgica", "Francia", "Italia", "Alemania", "España" }; y en lugar de llamar a: myAdapter.add (tmpItem); Llamé; myAdapter.add (PAÍSES [i]) e incluso PAÍSES [0]. ¡Gracias por su ayuda! – Rob¿Hay alguna manera de publicar el código completo? – Rob
Puede cargar un archivo zip de proyecto minimalista en algún lado o editar su pregunta anterior y agregar el código allí ... – WarrenFaith