2011-10-06 21 views
9

मैं एक ऐप लिख रहा हूं जिसके लिए उपयोगकर्ता से इनपुट प्राप्त करने की आवश्यकता है, इसे सर्वर पर भेजना, जो एक JSON स्ट्रिंग देता है, और उसके बाद सूची दृश्य में अपनी पार्स की गई सामग्री प्रदर्शित करता है। मैं वर्तमान में विस्तार AsyncTask द्वारा इस को पूरा कर रहा हूँ:एंड्रॉइड adapter.notifyDataSetChanged() काम नहीं कर रहा है?

//stripped down version 
public class main extends ListActivity { 

ArrayList<String> listItems = new ArrayList<String>(); 
ArrayAdapter<String> adapter; 
final EditText input = (EditText)findViewById(R.id.input); 


input.addTextChangedListener(new TextWatcher() {  
    public void onTextChanged(CharSequence s, int start, int before, int count) { 
      if(!input.getText().toString().equals("")) { 
      new GetDataTask().execute(input.getText().toString()); 
     } 

    } 
}); 

private class GetDataTask extends AsyncTask<String, Void, ArrayList<String>> { 
     protected ArrayList<String> doInBackground(String... query) { 

     URL url = new URL("http://myserversaddressgoeshere.com/search/thequerygoeshere"); 
     URLConnection conn = url.openConnection(); 
     BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
      ArrayList<String> items = new ArrayList<String>(); 
     //the code that parses the JSON goes here; it writes some strings to items 
     return items; 
     } 

     protected void onPostExecute(ArrayList<String> items) { 
      listItems = items; 
     adapter.notifyDataSetChanged(); 
     } 
} 

} 

(यह मेरी पहली पोस्ट है तो मैं पहले से माफी माँगता हूँ अगर है कि एक कोड ब्लॉक में विफल रहता है बनाने के लिए मेरे प्रयास) onPostExecute विधि में

, सेट करने के बाद सूची आइटम्स के बराबर होती है, अगर मैं सूची की सामग्री मुद्रित करता हूं, तो वे वही हैं जो मैं चाहता हूं। लेकिन, किसी कारण से, जबPostExecute से निष्पादित किया गया, adapter.notifyDataSetChanged() ऐसा कुछ नहीं लगता है (जब इसे मुख्य धागे से कहा जाता है, यह ठीक काम करता है)।

अगर किसी को पता चल रहा है कि यह क्या हो रहा है और/या इसे कैसे ठीक किया जाए, तो मैं वास्तव में इसकी सराहना करता हूं। धन्यवाद!

उत्तर

21

आप इस

protected void onPostExecute(ArrayList<String> items) { 
     listItems.clear(); 
     listItems.addAll(items); 
     adapter.notifyDataSetChanged(); 
    } 

कोशिश कर सकते हैं और मैं आशा है कि आप पहले से ही इस

adapter = new ArrayAdapter<String>(listItems); 
+0

ओह, मुझे लगता है कि घोषणा बाहर छोड़ दिया कुछ कर रहे हैं है। एडाप्टर = नया ऐरेएडाप्टर (यह, \t \t android.R.layout.simple_list_item_1, listItems); –

+0

आपने ** स्पष्ट() ** और ** addAll() ** – Samuel

+0

और यह काम किया; आपका बहुत बहुत धन्यवाद! जिज्ञासा से बाहर, क्या आप जानते हैं कि क्यों स्पष्ट -> addAll -> सूचित करेंडीएससी काम करता है लेकिन मेरे पास क्या नहीं था? –

संबंधित मुद्दे