पर काम नहीं कर रहा है मेरे पास एक AutoCompleteTextView (textView) घटक से जुड़ा एक ArrayAdapter (myAdapter) है।
एक बार जब उपयोगकर्ता एक चरित्र दबाता है तो मैं इस चरित्र वाले आइटमों के साथ AutoCompleteTextView की ड्रॉप डाउन सूची पॉप्युलेट करना चाहता हूं।
मैं AsyncTask (जो एक वेब सेवा का उपयोग करता है) का उपयोग कर आइटम पुनर्प्राप्त करता हूं।एंड्रॉइड, ऐरेएडाप्टर का() फ़ंक्शन
मैं myAdapter.add (आइटम) को कॉल करता हूं लेकिन ड्रॉप डाउन सूची खाली है।
मैंने प्रत्येक अतिरिक्त के बाद myAdapter.getCount() को कॉल किया और यह हर बार शून्य दिखाता है। कॉलिंग अधिसूचना DataSetChanged() मदद नहीं की।
मैंने अपनी कस्टम ऑब्जेक्ट्स के बजाय सरल स्ट्रिंग ऑब्जेक्ट्स जोड़ने का भी प्रयास नहीं किया, इसका कोई फायदा नहीं हुआ।
मैं क्या गलत कर रहा हूँ?
संपादित करें: मैंने कोड को नीचे दिए गए miette के रूप में बदल दिया है लेकिन अभी भी इसका कोई फायदा नहीं हुआ है।
आम तौर पर, मेरे ऑटो पूर्ण टेक्स्ट व्यू में टेक्स्ट बदलने के बाद मैं क्या करता हूं, मैं एक नया AsyncTask कॉल करता हूं और इसे दर्ज टेक्स्ट और हैंडलर पास करता हूं (बाद में टेक्स्ट चेंज() देखें)। कार्य टेक्स्ट से प्रासंगिक वस्तुओं को पुनर्प्राप्त करता है और एक बार हैंडलर के हैंडल मैसेज() को कॉल किया जाता है। हैंडल मैसेज() में मैं एडाप्टर की ऑब्जेक्ट्स को पॉप्युलेट करने का प्रयास करता हूं। लेकिन फिर भी एडाप्टर की ड्रॉप डाउन सूची खाली हो जाती है।
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();
}
};
}
धन्यवाद एक बहुत रोब
यहाँ मैं क्या किया है: मैं एक हैंडलर परिभाषित और यह बहुत की तरह मेरे AsyncTask (AppTask कहा जाता है) में डाल पैरामीटर: फिर()
new AppTask().execute(new AppTask.Payload(Consts.taskType.SEARCH_STOCK, \t \t \t \t new Object[] {text, handler}, this));
, मेरे हैंडलर के handleMessage में मैं addItemsToAdapter बुलाया । स्ट्रिंग्स के लिए, मैंने इस सरणी को घोषित किया: निजी स्थिर अंतिम स्ट्रिंग [] COUNTRIES = नया स्ट्रिंग [] { "बेल्जियम", "फ्रांस", "इटली", "जर्मनी", "स्पेन" }; और कॉल करने के बजाय: myAdapter.add (tmpItem); मैंने फोन किया; myAdapter.add (COUNTRIES [i]) और यहां तक कि COUNTRIES [0]। आपकी मदद के लिए धन्यवाद! – Robक्या कोई तरीका है कि मैं पूरा कोड पोस्ट कर सकता हूं? – Rob
आप कहीं भी एक साधारण परियोजना ज़िप अपलोड कर सकते हैं या ऊपर अपना प्रश्न संपादित कर सकते हैं और कोड जोड़ सकते हैं ... – WarrenFaith