2012-06-24 44 views
0

時,這應該是非常簡單的,我仍然看不出什麼/如何的東西可能是零。 我也想有一個AutoCompleteTextView與結果從谷歌Places API的。 我可以看到我的URL創建是正確的,我收到來自谷歌,但在結果被傳播到TextView的,一切都崩潰結果的NullPointerException設置textView.setAdapter(

XML佈局 - places_search.xml:

<?xml version="1.0" encoding="utf-8"?> 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="#dddddd"> 

<AutoCompleteTextView android:id="@+id/autoCompleteTextView1" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="10dp" > 
    <requestFocus></requestFocus> 
    </AutoCompleteTextView> 
</RelativeLayout> 

爲TextView的XML佈局:

<?xml version="1.0" encoding="utf-8"?> 
<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:padding="10dp" 
    android:textSize="16sp" 
    android:textColor="#000"> 
</TextView> 

而下面是搜索谷歌地方API的自動完成結果的完整代碼。

public class PlacesListSearchActivity extends Activity { 

    private static final String TAG = "PlacesListActivity"; 

    private ResultReceiver mReceiver; 

    private OnSharedPreferenceChangeListener sharedPreferencesListener; 
    private SharedPreferences sharedPreferences; 

    /** Called when the activity is first created. */ 
    public ArrayAdapter<String> adapter; 
    public AutoCompleteTextView textView; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.places_search); 
     final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,R.layout.item_list); 
     final AutoCompleteTextView textView = (AutoCompleteTextView)findViewById(R.id.autoCompleteTextView1); 
     adapter.setNotifyOnChange(true); 
     textView.setHint("type store name"); 
     textView.setAdapter(adapter); 
     textView.addTextChangedListener(new TextWatcher() { 

     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      if (count%3 == 1) { 
       adapter.clear(); 
        GetPlaces task = new GetPlaces(); 
        //now pass the argument in the textview to the task 
        task.execute(textView.getText().toString()); 
      } 
     } 

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

     } 

     public void afterTextChanged(Editable s) { 

     } 

     }); 
    } 

    class GetPlaces extends AsyncTask<String, Void, ArrayList<String>> { 
     @Override 
     // three dots is java for an array of strings 
     protected ArrayList<String> doInBackground(String... args) 
     { 
      Log.d("gottaGo", "doInBackground"); 
      ArrayList<String> predictionsArr = new ArrayList<String>(); 
      try 
      { 
       URL googlePlaces = new URL(
         "https://maps.googleapis.com/maps/api/place/autocomplete/json?input=" + 
         URLEncoder.encode(args[0], "UTF-8") + 
         "&types=geocode&language=en&sensor=true&key=" + 
         getResources().getString(R.string.googleAPIKey)); 

       Log.d("URL", googlePlaces.toString()); 

       URLConnection tc = googlePlaces.openConnection(); 
       BufferedReader in = new BufferedReader(new InputStreamReader(
         tc.getInputStream())); 

       String line; 
       StringBuffer sb = new StringBuffer(); 
       //take Google's legible JSON and turn it into one big string. 
       while ((line = in.readLine()) != null) { 
        sb.append(line); 
       } 
       //turn that string into a JSON object 
       JSONObject predictions = new JSONObject(sb.toString()); 
       //now get the JSON array that's inside that object    
       JSONArray ja = new JSONArray(predictions.getString("predictions")); 

       for (int i = 0; i < ja.length(); i++) { 
        JSONObject jo = (JSONObject) ja.get(i); 
        //add each entry to our array 
        predictionsArr.add(jo.getString("description")); 
       } 
      } catch (IOException e) 
      { 
      Log.e("YourApp", "GetPlaces : doInBackground", e); 
      } catch (JSONException e) 
      { 


    Log.e("YourApp", "GetPlaces : doInBackground", e); 
     } 

     return predictionsArr; 
    } 

    //then our post 
    @Override 
    protected void onPostExecute(ArrayList<String> result){ 
     Log.d("YourApp", "onPostExecute : " + result.size()); 
     //update the adapter 
     adapter = new ArrayAdapter<String>(getBaseContext(), R.layout.item_list); 
     adapter.setNotifyOnChange(true); 
     //attach the adapter to textview 
     textView.setAdapter(adapter); 

     for (String string : result) { 
      Log.d("YourApp", "onPostExecute : result = " + string); 
      adapter.add(string); 
      adapter.notifyDataSetChanged(); 
     } 

     Log.d("YourApp", "onPostExecute : autoCompleteAdapter" + adapter.getCount()); 
    } 

} 

} 
下面

是logcat的:

06-24 09:34:41.225: E/AndroidRuntime(10588): FATAL EXCEPTION: main 
06-24 09:34:41.225: E/AndroidRuntime(10588): java.lang.NullPointerException 
06-24 09:34:41.225: E/AndroidRuntime(10588): at com.rathinavelu.rea.PlacesListSearchActivity$GetPlaces.onPostExecute(PlacesListSearchActivity.java:156) 
06-24 09:34:41.225: E/AndroidRuntime(10588): at com.rathinavelu.rea.PlacesListSearchActivity$GetPlaces.onPostExecute(PlacesListSearchActivity.java:1) 
06-24 09:34:41.225: E/AndroidRuntime(10588): at android.os.AsyncTask.finish(AsyncTask.java:602) 
06-24 09:34:41.225: E/AndroidRuntime(10588): at android.os.AsyncTask.access$600(AsyncTask.java:156) 
06-24 09:34:41.225: E/AndroidRuntime(10588): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:615) 
06-24 09:34:41.225: E/AndroidRuntime(10588): at android.os.Handler.dispatchMessage(Handler.java:99) 
06-24 09:34:41.225: E/AndroidRuntime(10588): at android.os.Looper.loop(Looper.java:137) 
06-24 09:34:41.225: E/AndroidRuntime(10588): at android.app.ActivityThread.main(ActivityThread.java:4507) 
06-24 09:34:41.225: E/AndroidRuntime(10588): at java.lang.reflect.Method.invokeNative(Native Method) 
06-24 09:34:41.225: E/AndroidRuntime(10588): at java.lang.reflect.Method.invoke(Method.java:511) 
06-24 09:34:41.225: E/AndroidRuntime(10588): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790) 
06-24 09:34:41.225: E/AndroidRuntime(10588): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557) 
06-24 09:34:41.225: E/AndroidRuntime(10588): at dalvik.system.NativeStart.main(Native Method) 

線156帶我到這行代碼:

textView.setAdapter(adapter); 

回答

1

其明顯的,你會得到NPE

您已經定義textView兩次。

1的OnCreate塊(這是本地)

final AutoCompleteTextView textView = (AutoCompleteTextView)findViewById(R.id.autoCompleteTextView1); 

2在類成員變量。

public AutoCompleteTextView textView; 

當您嘗試設置適配器時,它查找未初始化的成員變量textView。

解決方法是刪除final AutoCompleteTextView

textView = (AutoCompleteTextView)findViewById(R.id.autoCompleteTextView1); 

逸岸你需要兩個修改到以下

adapter = new ArrayAdapter<String>(this,R.layout.item_list); 
textView = (AutoCompleteTextView)findViewById(R.id.autoCompleteTextView1); 

如果在成員變量,那麼爲什麼你是在本地重新定義他們的onCreate定義它們。 如果您嘗試從AsyncTask訪問它們,它將查找未初始化的成員變量。

+0

我明白你的意思,我太傻了,我無法看到它。我不應該宣佈textView兩次,所以我改爲以下行: textView =(AutoCompleteTextView)findViewById(R.id.autoCompleteTextView1); 我不明白你爲什麼認爲我應該完全刪除textView的初始化,我仍然需要設置相關的XML文件。 – theAlse

+0

糟糕!我編輯了我的答案 –

3

變化

final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,R.layout.item_list); 
final AutoCompleteTextView textView = (AutoCompleteTextView)findViewById(R.id.autoCompleteTextView1) 

adapter = new ArrayAdapter<String>(this,R.layout.item_list); 
textView = (AutoCompleteTextView)findViewById(R.id.autoCompleteTextView1) 
相關問題