2011-04-25 137 views
2

我已經在我的Android應用程序下面的代碼:ArrayAdapter.getCount()NullPointerException異常

protected ArrayList<String> message; 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.where_to_go); 

     whereToGoField = (AutoCompleteTextView)findViewById(R.id.WhereToGoField); 

     adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line); 
     whereToGoField.addTextChangedListener(whereToGoFieldInputWatcher); 
     whereToGoField.setAdapter(adapter); 
    } 


    TextWatcher whereToGoFieldInputWatcher = new TextWatcher() { 
     public void onTextChanged(final CharSequence s, int start, int before, int count) { 
     Thread t = new Thread() { 
      public void run() { 
       Object o = Server.getStreetSuggestions(s.toString()); 
       if (o!=null) { 
        message = (ArrayList<String>)o; 
       } 
       messageHandler.sendEmptyMessage(0); 
      } 
     }; 
     t.start(); 
     } 

    }; 

    private Handler messageHandler = new Handler() { 
     public void handleMessage(Message msg) { 
     adapter.clear(); 
      for(int i=0; i<message.size(); ++i){ 
       adapter.add(message.get(i)); 
      } 
      adapter.notifyDataSetChanged(); 
     } 
    }; 

Basicaly它從我的服務器響應並填充autocompletetextview此響應。

但有些時候,我收到以下錯誤:

04-25 16:08:42.288: ERROR/AndroidRuntime(6193): FATAL EXCEPTION: main 
04-25 16:08:42.288: ERROR/AndroidRuntime(6193): java.lang.NullPointerException 
04-25 16:08:42.288: ERROR/AndroidRuntime(6193):  at android.widget.ArrayAdapter.getCount(ArrayAdapter.java:322) 
04-25 16:08:42.288: ERROR/AndroidRuntime(6193):  at android.widget.AdapterView.checkFocus(AdapterView.java:720) 
04-25 16:08:42.288: ERROR/AndroidRuntime(6193):  at android.widget.AdapterView$AdapterDataSetObserver.onInvalidated(AdapterView.java:844) 
04-25 16:08:42.288: ERROR/AndroidRuntime(6193):  at android.database.DataSetObservable.notifyInvalidated(DataSetObservable.java:74) 
04-25 16:08:42.288: ERROR/AndroidRuntime(6193):  at android.widget.BaseAdapter.notifyDataSetInvalidated(BaseAdapter.java:85) 
04-25 16:08:42.288: ERROR/AndroidRuntime(6193):  at android.widget.ArrayAdapter$ArrayFilter.publishResults(ArrayAdapter.java:500) 
04-25 16:08:42.288: ERROR/AndroidRuntime(6193):  at android.widget.Filter$ResultsHandler.handleMessage(Filter.java:313) 
04-25 16:08:42.288: ERROR/AndroidRuntime(6193):  at android.os.Handler.dispatchMessage(Handler.java:130) 
04-25 16:08:42.288: ERROR/AndroidRuntime(6193):  at android.os.Looper.loop(Looper.java:154) 
04-25 16:08:42.288: ERROR/AndroidRuntime(6193):  at android.app.ActivityThread.main(ActivityThread.java:4668) 
04-25 16:08:42.288: ERROR/AndroidRuntime(6193):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-25 16:08:42.288: ERROR/AndroidRuntime(6193):  at java.lang.reflect.Method.invoke(Method.java:552) 
04-25 16:08:42.288: ERROR/AndroidRuntime(6193):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:917) 
04-25 16:08:42.288: ERROR/AndroidRuntime(6193):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:674) 
04-25 16:08:42.288: ERROR/AndroidRuntime(6193):  at dalvik.system.NativeStart.main(Native Method) 

我不明白它是從哪裏來的。

你能幫我嗎?

回答

0

看看這有助於(添加):

private Handler messageHandler = new Handler() { 
     public void handleMessage(Message msg) { 
     adapter.setNotifyOnChange(false); //stop notification while adding data 
     adapter.clear(); 
      for(int i=0; i<message.size(); ++i){ 
       adapter.add(message.get(i)); 
      } 
      adapter.notifyDataSetChanged(); 
     } 
    }; 
+0

不,它沒有幫助 – skywa1ker 2011-04-25 10:34:01

0

這是我做了什麼:

TextWatcher whereToGoFieldInputWatcher = new TextWatcher() { 
     public void onTextChanged(final CharSequence s, int start, int before, int count) { 
     new AsyncTask<Integer, Void, ArrayList<String>>() { 

      @Override 
      protected synchronized void onPostExecute(ArrayList<String> result) { 
       //make arrayAdapter from result 
       //set adapter to AutoCompleteTextView 
       adapter.clear(); 
       for (String name : result) { 
        adapter.add(name); 
       } 
       adapter.notifyDataSetChanged(); 
      } 

      @Override 
      protected ArrayList<String> doInBackground(Integer... params) { 
       // make connection to remote server 
       // retrive response from remote server 
       // make arrayList from response 
       return Server.getSuggestions(s.toString()); 
      } 
     }.execute(1); 
     } 

     @Override 
     public void afterTextChanged(Editable arg0) { 
     // TODO Auto-generated method stub 

     } 

     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, 
      int after) { 
     // TODO Auto-generated method stub 

     } 
    }; 

,看起來像它的工作原理。