Tôi có một ArrayAdapter (myAdapter) được đính kèm với một thành phần AutoCompleteTextView (textView).
Khi người dùng nhấn một ký tự, tôi muốn điền danh sách thả xuống của AutoCompleteTextView với các mục chứa ký tự này.
Tôi truy xuất các mục bằng cách sử dụng AsyncTask (sử dụng dịch vụ web).Android, hàm add() của ArrayAdapter không hoạt động
Tôi gọi myAdapter.add (mục) nhưng danh sách thả xuống trống.
Tôi đã thêm một cuộc gọi myAdapter.getCount() sau mỗi lần thêm và nó hiển thị bằng không mọi lúc. Gọi notificationDataSetChanged() không giúp được gì.
Tôi thậm chí đã cố gắng thêm các đối tượng String đơn giản thay vì các đối tượng tùy chỉnh của tôi, không có kết quả.
Tôi đang làm gì sai?
Chỉnh sửa: Tôi đã thay đổi mã như miette được đề xuất bên dưới nhưng vẫn không có kết quả.
Nói chung, những gì tôi làm là sau khi văn bản được thay đổi trong chế độ xem văn bản hoàn toàn tự động của tôi, tôi gọi AsyncTask mới và chuyển nó vào văn bản đã nhập và Trình xử lý (xem afterTextChanged()). Nhiệm vụ truy lục các đối tượng liên quan đến văn bản và một khi đã thực hiện handleMessage() của Handler() được gọi. Trong handleMessage(), tôi cố gắng đưa các đối tượng của adapter. Nhưng danh sách thả xuống của adapter vẫn kết thúc.
Đây là mã của tôi:
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();
}
};
}
Thanks a lot, Rob
Đây là những gì tôi đã làm: Tôi định nghĩa một Handler và đặt nó trong AsyncTask của tôi (gọi tắt là AppTask) params như vậy:
new AppTask().execute(new AppTask.Payload(Consts.taskType.SEARCH_STOCK, \t \t \t \t new Object[] {text, handler}, this));
Sau đó, trong handleMessage Handler của tôi() Tôi gọi addItemsToAdapter . Đối với các Chuỗi, tôi đã khai báo mảng này: Chuỗi cuối cùng riêng tư [] COUNTRIES = new String [] { "Bỉ", "Pháp", "Ý", "Đức", "Tây Ban Nha" }; và thay vì gọi: myAdapter.add (tmpItem); Tôi đã gọi; myAdapter.add (COUNTRIES [i]) và thậm chí COUNTRIES [0]. Cảm ơn sự giúp đỡ của bạn! – RobCó cách nào tôi có thể đăng toàn bộ mã không? – Rob
Bạn có thể tải lên zip dự án tối thiểu ở đâu đó hoặc chỉnh sửa câu hỏi của bạn ở trên và thêm mã ở đó ... – WarrenFaith