java.lang.IllegalStateException: You cannot call onTextChanged with a non filterable adapter

        原因:项目里要做一个通讯录搜索功能,ListView的headview里有一个editText,通过给editText.addTextChangedListener(TextWatcher tw)来给外界提供接口,但是在搜索的过程中一直报错:

08-04 07:44:31.883: E/AndroidRuntime(1800): FATAL EXCEPTION: main
08-04 07:44:31.883: E/AndroidRuntime(1800): java.lang.IllegalStateException: You cannot call onTextChanged with a non filterable adapter
08-04 07:44:31.883: E/AndroidRuntime(1800): 	at android.widget.AbsListView.onTextChanged(AbsListView.java:5757)
08-04 07:44:31.883: E/AndroidRuntime(1800): 	at android.widget.TextView.sendOnTextChanged(TextView.java:7372)
08-04 07:44:31.883: E/AndroidRuntime(1800): 	at android.widget.TextView.handleTextChanged(TextView.java:7431)
08-04 07:44:31.883: E/AndroidRuntime(1800): 	at android.widget.TextView$ChangeWatcher.onTextChanged(TextView.java:9142)
08-04 07:44:31.883: E/AndroidRuntime(1800): 	at android.text.SpannableStringBuilder.sendTextChanged(SpannableStringBuilder.java:966)
08-04 07:44:31.883: E/AndroidRuntime(1800): 	at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:500)
08-04 07:44:31.883: E/AndroidRuntime(1800): 	at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:435)
08-04 07:44:31.883: E/AndroidRuntime(1800): 	at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:30)
08-04 07:44:31.883: E/AndroidRuntime(1800): 	at android.view.inputmethod.BaseInputConnection.replaceText(BaseInputConnection.java:677)
08-04 07:44:31.883: E/AndroidRuntime(1800): 	at android.view.inputmethod.BaseInputConnection.commitText(BaseInputConnection.java:201)
08-04 07:44:31.883: E/AndroidRuntime(1800): 	at com.android.internal.widget.EditableInputConnection.commitText(EditableInputConnection.java:183)
08-04 07:44:31.883: E/AndroidRuntime(1800): 	at android.view.inputmethod.InputConnectionWrapper.commitText(InputConnectionWrapper.java:85)
08-04 07:44:31.883: E/AndroidRuntime(1800): 	at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:288)
08-04 07:44:31.883: E/AndroidRuntime(1800): 	at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:83)
08-04 07:44:31.883: E/AndroidRuntime(1800): 	at android.os.Handler.dispatchMessage(Handler.java:99)
08-04 07:44:31.883: E/AndroidRuntime(1800): 	at android.os.Looper.loop(Looper.java:137)
08-04 07:44:31.883: E/AndroidRuntime(1800): 	at android.app.ActivityThread.main(ActivityThread.java:5457)
08-04 07:44:31.883: E/AndroidRuntime(1800): 	at java.lang.reflect.Method.invokeNative(Native Method)
08-04 07:44:31.883: E/AndroidRuntime(1800): 	at java.lang.reflect.Method.invoke(Method.java:525)
08-04 07:44:31.883: E/AndroidRuntime(1800): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:875)
08-04 07:44:31.883: E/AndroidRuntime(1800): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:691)
08-04 07:44:31.883: E/AndroidRuntime(1800): 	at dalvik.system.NativeStart.main(Native Method)

从日志来看是与adapter以及filterable有关,搜索了大半天也没有什么有用的资料,只是知道了filterable是个接口,通常由adapter实现,用来过滤筛选数据。

实现它必须实现的方法:  public Filter getFilter();

另外它还有两个比较重要的方法:

protected FilterResults  performFiltering(CharSequence prefix);  从方法名可以猜出 这里执行过滤;

 protected void publishResults(CharSequence constraint,FilterResults results);发布结果,通常用来刷新adapter


我尝试着把自己的adapter实现filterable接口,然后自己写了一个Filter,问题就解决了。。。。有些莫名其妙!!!

1.首先实现接口

@Override
    public Filter getFilter()
    {
        // TODO Auto-generated method stub
        if (null==mFilter)
        {
            mFilter = new MyFilter();
        }
        return mFilter;
    }
2.写一个Filter

private MyFilter mFilter;
    private class MyFilter extends Filter{
        @Override
        protected FilterResults performFiltering(CharSequence constraint)
        {
            return null;
        }
        @Override
        protected void publishResults(CharSequence constraint,FilterResults results)
        {
        }
        
    }

就这样,不会再报java.lang.IllegalStateException: You cannot call onTextChanged with a non filterable adapter了。




你可能感兴趣的:(java.lang.IllegalStateException: You cannot call onTextChanged with a non filterable adapter)