Frage

I have this listview:

private EditText mySearchView;
private ListView listView;
ArrayAdapter<String> adapter;

@Override
        public void onComplete(List<Profile> friends) {

            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    mSpinner.setVisibility(View.GONE);
                    mSpinner.clearAnimation();
                }
                });

            // populate list
            List<String> values = new ArrayList<String>();
            for (Profile profile : friends) {
                //profile.getInstalled();
                values.add(profile.getName());
            }


            mySearchView = (EditText) findViewById(R.id.searchText);
            listView = (ListView) findViewById(R.id.list);
            listView.setOnItemClickListener(new OnItemClickListener() {

                @Override
                public void onItemClick(AdapterView<?> av, final View view, final int i, long i2) {

                  Animation pushLeftIn = AnimationUtils.loadAnimation(CallActivity.this, R.anim.jump_no_fade);
                  view.startAnimation(pushLeftIn);

            }
            });

            ArrayAdapter<String> adapter = new ArrayAdapter<String>(getApplicationContext(), R.layout.list_items2, values);
            adapter.sort(new Comparator<String>() {

                @Override
                public int compare(String lhs, String rhs) {
                    return lhs.compareTo(rhs);    
                }
            });

            mySearchView.addTextChangedListener(new TextWatcher() {

                @Override
                public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
                    // When user changed the Text
                    CallActivity.this.adapter.getFilter().filter(cs);   
                }

                @Override
                public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                        int arg3) {
                    // TODO Auto-generated method stub

                }

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

            mFriendsList.setAdapter(adapter);
        }
    };

I have tried setting a textwatcher linked to the edittext, in order to use the edittext to filter the listview, it seems to work good no errors in the code, but when i open up the app and type the first character inside the edittext it crashes and i get this LogCat error:

05-05 17:09:45.794: E/AndroidRuntime(6732): FATAL EXCEPTION: main
05-05 17:09:45.794: E/AndroidRuntime(6732): java.lang.NullPointerException
05-05 17:09:45.794: E/AndroidRuntime(6732):     at com.example.test.CallActivity$1$4.onTextChanged(CallActivity.java:133)
05-05 17:09:45.794: E/AndroidRuntime(6732):     at android.widget.TextView.sendOnTextChanged(TextView.java:7407)
05-05 17:09:45.794: E/AndroidRuntime(6732):     at android.widget.TextView.handleTextChanged(TextView.java:7469)
05-05 17:09:45.794: E/AndroidRuntime(6732):     at android.widget.TextView$ChangeWatcher.onTextChanged(TextView.java:9218)
05-05 17:09:45.794: E/AndroidRuntime(6732):     at android.text.SpannableStringBuilder.sendTextChanged(SpannableStringBuilder.java:962)
05-05 17:09:45.794: E/AndroidRuntime(6732):     at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:496)
05-05 17:09:45.794: E/AndroidRuntime(6732):     at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:435)
05-05 17:09:45.794: E/AndroidRuntime(6732):     at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:30)
05-05 17:09:45.794: E/AndroidRuntime(6732):     at android.view.inputmethod.BaseInputConnection.replaceText(BaseInputConnection.java:676)
05-05 17:09:45.794: E/AndroidRuntime(6732):     at android.view.inputmethod.BaseInputConnection.setComposingText(BaseInputConnection.java:435)
05-05 17:09:45.794: E/AndroidRuntime(6732):     at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:333)
05-05 17:09:45.794: E/AndroidRuntime(6732):     at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:77)
05-05 17:09:45.794: E/AndroidRuntime(6732):     at android.os.Handler.dispatchMessage(Handler.java:99)
05-05 17:09:45.794: E/AndroidRuntime(6732):     at android.os.Looper.loop(Looper.java:137)
05-05 17:09:45.794: E/AndroidRuntime(6732):     at android.app.ActivityThread.main(ActivityThread.java:4867)
05-05 17:09:45.794: E/AndroidRuntime(6732):     at java.lang.reflect.Method.invokeNative(Native Method)
05-05 17:09:45.794: E/AndroidRuntime(6732):     at java.lang.reflect.Method.invoke(Method.java:511)
05-05 17:09:45.794: E/AndroidRuntime(6732):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007)
05-05 17:09:45.794: E/AndroidRuntime(6732):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774)
05-05 17:09:45.794: E/AndroidRuntime(6732):     at dalvik.system.NativeStart.main(Native Method)

Any tips on why this is happening or how i could modify the code to make it work?

War es hilfreich?

Lösung

In your onCreate(), initialize the member variable adapter instead of a local variable. Change this

ArrayAdapter<String> adapter = new ArrayAdapter<String>(getApplicationContext(), R.layout.list_items2, values);

to

adapter = new ArrayAdapter<String>(getApplicationContext(), R.layout.list_items2, values);

Andere Tipps

Are you sure you're always returning a non-null filter in your getFilter method?

Separate this line into components to see exactly where the NullPointerException is occurring. Change:

CallActivity.this.adapter.getFilter().filter(cs);

to

ArrayAdapter<String> myAdapter = CallActivity.this.adapter;
Filter filter = myAdapter.getFilter();
filter.filter(cs);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top