2013-02-08 44 views
0

我想使用编辑文本在我的列表中进行搜索,但是当我尝试在编辑文本中输入某些内容时,应用程序停止并在控制台中显示以下错误。使用编辑文本在列表中过滤

02-08 09:46:23.675: E/AndroidRuntime(3759): FATAL EXCEPTION: main 
02-08 09:46:23.675: E/AndroidRuntime(3759): java.lang.NullPointerException 
02-08 09:46:23.675: E/AndroidRuntime(3759):  at com.example.search.MainActivity$JSONfunctions.onTextChanged(MainActivity.java:142) 
02-08 09:46:23.675: E/AndroidRuntime(3759):  at android.widget.TextView.sendOnTextChanged(TextView.java:7092) 
02-08 09:46:23.675: E/AndroidRuntime(3759):  at android.widget.TextView.handleTextChanged(TextView.java:7151) 
02-08 09:46:23.675: E/AndroidRuntime(3759):  at android.widget.TextView$ChangeWatcher.onTextChanged(TextView.java:8794) 
02-08 09:46:23.675: E/AndroidRuntime(3759):  at android.text.SpannableStringBuilder.sendTextChanged(SpannableStringBuilder.java:962) 
02-08 09:46:23.675: E/AndroidRuntime(3759):  at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:496) 
02-08 09:46:23.675: E/AndroidRuntime(3759):  at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:435) 
02-08 09:46:23.675: E/AndroidRuntime(3759):  at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:30) 
02-08 09:46:23.675: E/AndroidRuntime(3759):  at android.text.method.QwertyKeyListener.onKeyDown(QwertyKeyListener.java:222) 
02-08 09:46:23.675: E/AndroidRuntime(3759):  at android.text.method.TextKeyListener.onKeyDown(TextKeyListener.java:136) 
02-08 09:46:23.675: E/AndroidRuntime(3759):  at android.widget.TextView.doKeyDown(TextView.java:5246) 
02-08 09:46:23.675: E/AndroidRuntime(3759):  at android.widget.TextView.onKeyDown(TextView.java:5065) 
02-08 09:46:23.675: E/AndroidRuntime(3759):  at android.view.KeyEvent.dispatch(KeyEvent.java:2609) 
02-08 09:46:23.675: E/AndroidRuntime(3759):  at android.view.View.dispatchKeyEvent(View.java:7198) 
02-08 09:46:23.675: E/AndroidRuntime(3759):  at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1359) 
02-08 09:46:23.675: E/AndroidRuntime(3759):  at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1359) 
02-08 09:46:23.675: E/AndroidRuntime(3759):  at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1359) 
02-08 09:46:23.675: E/AndroidRuntime(3759):  at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1359) 
02-08 09:46:23.675: E/AndroidRuntime(3759):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:1920) 
02-08 09:46:23.675: E/AndroidRuntime(3759):  at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1395) 
02-08 09:46:23.675: E/AndroidRuntime(3759):  at android.app.Activity.dispatchKeyEvent(Activity.java:2370) 
02-08 09:46:23.675: E/AndroidRuntime(3759):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1847) 
02-08 09:46:23.675: E/AndroidRuntime(3759):  at android.view.ViewRootImpl.deliverKeyEventPostIme(ViewRootImpl.java:3701) 
02-08 09:46:23.675: E/AndroidRuntime(3759):  at android.view.ViewRootImpl.handleImeFinishedEvent(ViewRootImpl.java:3651) 
02-08 09:46:23.675: E/AndroidRuntime(3759):  at android.view.ViewRootImpl$ViewRootHandler.handleMessage(ViewRootImpl.java:2818) 
02-08 09:46:23.675: E/AndroidRuntime(3759):  at android.os.Handler.dispatchMessage(Handler.java:99) 
02-08 09:46:23.675: E/AndroidRuntime(3759):  at android.os.Looper.loop(Looper.java:137) 
02-08 09:46:23.675: E/AndroidRuntime(3759):  at android.app.ActivityThread.main(ActivityThread.java:5039) 
02-08 09:46:23.675: E/AndroidRuntime(3759):  at java.lang.reflect.Method.invokeNative(Native Method) 
02-08 09:46:23.675: E/AndroidRuntime(3759):  at java.lang.reflect.Method.invoke(Method.java:511) 
02-08 09:46:23.675: E/AndroidRuntime(3759):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
02-08 09:46:23.675: E/AndroidRuntime(3759):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
02-08 09:46:23.675: E/AndroidRuntime(3759):  at dalvik.system.NativeStart.main(Native Method) 

我的代码:

public class MainActivity extends ListActivity { 

    SimpleAdapter adapter; 
    ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>(); 

     @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
      setContentView(R.layout.list); 

     JSONfunctions jsfn=new JSONfunctions(); 
     jsfn.execute("http://192.168.6.43/employees.php"); 
    } 


    public class JSONfunctions extends AsyncTask<String, Integer, ArrayList<HashMap<String, String>> > implements TextWatcher { 


     InputStream is; 
     String result ; 
     JSONObject jArray; 
     ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>(); 

     @Override 
     protected ArrayList<HashMap<String, String>> doInBackground(String... params) 
     { 

      try{ 
/*get jobject from the url 
       HttpClient httpclient = new DefaultHttpClient(); 

       HttpPost httppost = new HttpPost(params[0]); 
       HttpResponse response = httpclient.execute(httppost); 
       HttpEntity entity = response.getEntity(); 
       is = entity.getContent(); 

     }catch(Exception e){ 
       Log.e("log_tag", "Error in http connection "+e.toString()); 
     } 
     try{ 
      BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8); 
      StringBuilder sb = new StringBuilder(); 
      String line = null; 
      while ((line = reader.readLine()) != null) { 
        sb.append(line + "\n"); 
      } 
      is.close(); 
      result=sb.toString(); 

    }catch(Exception e){ 
      Log.e("log_tag", "Error converting result "+e.toString()); 
    } 

    try{ 

     jArray = new JSONObject(result);  

     // MainActivity.dataFromAsyncTask=jArray; 
    }catch(JSONException e){ 
      Log.e("log_tag", "Error parsing data "+e.toString()); 
    }*/ 
      try{ 

       JSONArray ip = jArray.getJSONArray("Employees"); 

       for(int i=0;i<ip.length();i++){      
        JSONArray e = ip.getJSONArray(i); 
        HashMap<String, String> map = new HashMap<String, String>();  

        map.put("name", e.getString(0)+" "+e.getString(1)+" "+e.getString(2)); 
        //map.put("email id",e.getString(3)); 
        //map.put("phone no",e.getString(4)); 

        mylist.add(map);   
       } 

      }catch(JSONException e)  { 
       Log.e("log_tag", "Error parsing data "+e.toString()); 
      } 
      return mylist; 

       } 

       @Override 
       protected void onPostExecute(ArrayList<HashMap<String, String>> result) 
       { 
        ListAdapter adapter = new SimpleAdapter(MainActivity.this, result , R.layout.activity_main, 
          new String[] { "name" }, 
          new int[] { R.id.item_title }); 
        MainActivity.this.setListAdapter(adapter);// If Activity extends ListActivity 
        final ListView lv = getListView(); 
        lv.setTextFilterEnabled(true); 
        EditText myFilter = (EditText) findViewById(R.id.editText1); 
        myFilter.addTextChangedListener(this); 
       } 

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

       } 

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

       } 

       @Override 
       public void onTextChanged(CharSequence s, int start, 
         int before, int count) { 
        // TODO Auto-generated method stub 
        MainActivity.this.adapter.getFilter().filter(s.toString()); 

       } 



} 
} 
+0

看到http://www.androidhive.info/2012/ 09/android-adding-search-functionality-to-listview/link。这可以帮助你。 –

回答

0

你永远不初始化您在onTextChanged方法使用适配器变量。所以,你要么写:

adapter = new SimpleAdapter(MainActivity.this, result , R.layout.activity_main, new String[] { "name" }, new int[] { R.id.item_title }); 

onPostExecute方法或您通过在onTextXhanged方法使用下面的代码过滤ListView

@Override 
public void onTextChanged(CharSequence s, int start, int before, int count) { 
    ((Filterable)MainActivity.this.getListView().getAdapter()).getFilter().filter(s.toString()); 
} 
+0

我已经在onPostExecute方法中初始化适配器。我尝试了第二种方式,但它对我无效。 –

+0

@ user1817840你在'MainActivity'中有'adapter'字段,然后你在'onPostExecute'中创建一个局部变量'adapter',这样它永远不会初始化的字段(在我的代码中,我不写'SimpleAdapter adapter ... 'onPostExecute')。 *不适用于我*根本没有帮助,也许你可以更好地解释发生了什么。 – Luksprog