2017-03-23 44 views
0

我想使用另一個類的適配器。但顯然有些不妥,因爲當我鍵入搜索欄的應用崩潰的值,日誌說:使用另一個類的適配器

lang.NullPointerException: Attempt to invoke virtual method 'android.widget.Filter android.widget.ArrayAdapter.getFilter()' on a null object reference 

這是我的代碼,我想使用onQueryTextChange方法適配器:

public class FindSkill extends AppCompatActivity { 
ArrayAdapter myAdapter; 
@Override 
      public boolean onQueryTextChange(String query) { 
       Parser parser = new Parser(FindSkill.this, data, listView); 
       myAdapter = (ArrayAdapter) parser.listView.getAdapter(); 

       myAdapter.getFilter().filter(query.toString()); 
       myAdapter.notifyDataSetChanged(); 

       return false; 
      } 

解析器類代碼:

public class Parser extends AsyncTask <Void, Void,Integer> { 

    Context ctx; 
    ListView listView; 
    String data; 
    ArrayList<String> titles = new ArrayList<>(); 


    public Parser(Context ctx, String data, ListView listView) { 
     this.ctx = ctx; 
     this.data=data; 
     this.listView = listView; 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 

    @Override 
    protected Integer doInBackground(Void... params) { 
     return this.parse(); 
    } 

    @Override 
    protected void onPostExecute(Integer integer) { 
     super.onPostExecute(integer); 

     if (integer == 1) { 
      ArrayAdapter adapter = new ArrayAdapter(ctx, android.R.layout.simple_list_item_1, titles); 
      listView.setAdapter(adapter); 
     } else { 
      Toast.makeText(ctx, "Unable to Parse", Toast.LENGTH_LONG).show(); 
     } 
    } 


    private int parse() { 


     try { 
      JSONArray ja = new JSONArray(data); 
      JSONObject jo = null; 

      titles.clear(); 

      for (int i = 0; i < ja.length(); i++) { 
       jo = ja.getJSONObject(i); 
       String title = jo.getString("post_title"); 
       titles.add(title); 
      } 
      return 1; 
     } catch (JSONException e) { 
      return 0; 
     } 
    } 
} 

回答

0

試試這個代碼:

myAdapter=(ArrayAdapter) parser.listView.getAdapter(); 

編輯:

嘗試使用接口回調:

創建接口類。

public interface TaskDelegate { 
    public void taskCompletionResult(); 
} 

然後傳入Parse類,當任務完成時調用回調方法。

Context ctx; 
ListView listView; 
String data; 
ArrayList<String> titles = new ArrayList<>(); 
TaskDelegate taskDelegate; 


public Parser(Context ctx, String data, ListView listView, TaskDelegate taskDelegate) { 
    this.ctx = ctx; 
    this.data=data; 
    this.listView = listView; 
    this.taskDelegate=taskDelegate; 
} 

@Override 
protected void onPreExecute() { 
    super.onPreExecute(); 
} 

@Override 
protected Integer doInBackground(Void... params) { 
    return this.parse(); 
} 

@Override 
protected void onPostExecute(Integer integer) { 
    super.onPostExecute(integer); 

    if (integer == 1) { 
     ArrayAdapter adapter = new ArrayAdapter(ctx, android.R.layout.simple_list_item_1, titles); 
     listView.setAdapter(adapter); 
     taskDelegate.taskCompletionResult(); 
    } else { 
     Toast.makeText(ctx, "Unable to Parse", Toast.LENGTH_LONG).show(); 
    } 
} 
. 
. 
. 
. 

然後實現接口,並將其

public class FindSkill extends AppCompatActivity implements TaskDelegate{ 
ArrayAdapter myAdapter; 
Parser parser=nulll; 
String qry=null; 

@Override 
public boolean onQueryTextChange(String query) { 
     qry=query; 
     parser = new Parser(FindSkill.this, data, listView,this); 
     return false; 
} 

public void taskCompletionResult() 
{ 
     myAdapter = (ArrayAdapter) parser.listView.getAdapter(); 
     myAdapter.getFilter().filter(qry.toString()); 
     myAdapter.notifyDataSetChanged(); 
} 
+0

我修改了代碼,以表明我已經使用這種方式。 – Jou

+0

檢查我編輯的答案。 –

+0

我無法使用myAdapter.getFilter()。filter(query.toString());在taskCompletionResult()方法中,因爲查詢在那裏沒有定義。並且該行還包含錯誤: 解析器解析器=新的解析器(FindSkill.this,data,listView,this); – Jou

相關問題