NullPointerException bij het instellen van textView.setAdapter (

Dit zou vrij eenvoudig moeten zijn, toch kan ik niet zien wat/hoe iets Null zou kunnen zijn. Ik heb geprobeerd een AutoCompleteTextView te hebben met resultaat van Google places api. Ik kan zien dat het maken van mijn URL's correct is, ik krijg resultaten van Google, maar wanneer het resultaat wordt doorgegeven aan de tekstView, crasht alles.

XML-indeling - places_search.xml:

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




    
    

XML-indeling voor TextView:

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


En hieronder vindt u de volledige code die zoekt naar resultaten voor automatisch aanvullen van Google plaatst 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 adapter;
    public AutoCompleteTextView textView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.places_search);
        final ArrayAdapter adapter = new ArrayAdapter(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> {
        @Override
       //three dots is java for an array of strings
        protected ArrayList doInBackground(String... args)
        {
            Log.d("gottaGo", "doInBackground");
            ArrayList predictionsArr = new ArrayList();
            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 result){
        Log.d("YourApp", "onPostExecute : " + result.size());
        //update the adapter
        adapter = new ArrayAdapter(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());
    }

}

}

hieronder is de 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)

Regel 156 neemt me mee naar deze regel in de code:

textView.setAdapter(adapter);
0

2 antwoord

Verandering

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

naar

 adapter = new ArrayAdapter(this,R.layout.item_list);
 textView = (AutoCompleteTextView)findViewById(R.id.autoCompleteTextView1)
3
toegevoegd

Het is duidelijk dat u NPE krijgt

U hebt tekstweergave twee keer gedefinieerd.

1 in Oncreate Block (wat lokaal is)

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

2 In klassenlidvariabelen.

public AutoCompleteTextView textView;

Wanneer u probeert Adapter in te stellen op zoek naar tekst van de lidvariabele Beeld dat niet is geïnitialiseerd.

De oplossing is om final AutoCompleteTextView te verwijderen.

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

Eigenlijk moet je beide wijzigen in volgende

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

Als u ze hebt gedefinieerd in lidvariabelen, waarom definieert u ze lokaal opnieuw in onCreate. Als u toegang probeert te krijgen vanuit AsyncTask, zoekt het naar niet-geïnitialiseerde lidvariabelen.

1
toegevoegd
Ik zie je punt, ik was dom en ik kon het niet zien. Ik had de tekstView niet tweemaal moeten declareren, dus ik veranderde naar de volgende regel: textView = (AutoCompleteTextView) findViewById (R.id.autoCompleteTextView & zwnj; 1); Ik begrijp niet waarom je denkt dat ik de initialisatie van textView volledig moet verwijderen, ik moet nog steeds het gerelateerde XML-bestand instellen.
toegevoegd de auteur theAlse, de bron
Oeps sloeg me daarvoor! Ik heb mijn antwoord bewerkt
toegevoegd de auteur Vipul Shah, de bron