2015-11-01 101 views
0

我有以下類正在過濾onQueryTextChange上的調用。問題是找到的結果不會在找到的結果列表中更新。例如,我有名單(見圖像的下方。):Android:適配器中的過濾器不起作用

enter image description here

我進查詢「TEST 1」,所以更新的結果應該只包含一個發現的行。

但是結果列表仍然是一樣的。

我想問我應該怎樣更新才能以正確的方式獲得過濾結果。

非常感謝您的任何建議。

MainActivity

searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 

      @Override 
      public boolean onQueryTextSubmit(String s) { 
       Logger.d("onQueryTextSubmit "); 
       return false; 
      } 

      @Override 
      public boolean onQueryTextChange(String s) { 
       Logger.d(s); 
       Logger.d("onQueryTextChange "); 
       mAdapter = new WlanNetworkAdapter(DataContainer.getAccessPointList(), getParent()).getFilter(); 
       mAdapter.filter(s.toString()); 
       //TODO: https://coderwall.com/p/zpwrsg/add-search-function-to-list-view-in-android 
       return true; 
      } 
     }); 

適配器:

public class WlanNetworkAdapter extends BaseAdapter implements Filterable { 

    private List<WlanNetwork> mAccessPointlist; 
    private Activity context; 
    private Filter mFilter; 
    LayoutInflater inflater; 
    private List<WlanNetwork> filteredWlanList; 

    public WlanNetworkAdapter(List<WlanNetwork> mAccessPointlist, Activity context) { 
     this.mAccessPointlist = mAccessPointlist; 
     this.context = context; 
    } 

    @Override 
    public int getCount() { 
     return mAccessPointlist.size(); 
    } 

    @Override 
    public Object getItem(int arg0) { 
     return mAccessPointlist.get(arg0); 
    } 

    @Override 
    public long getItemId(int arg0) { 
     // TODO Auto-generated method stub 
     return arg0; 
    } 

    @Override 
    public View getView(int arg0, View rowView, ViewGroup arg2) { 
     //With this simple check, we can save the overhead of inflating a new view for each row. 
     //This will make our listview faster. 
     if (rowView == null) { 
      LayoutInflater inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE); 
      rowView = inflater.inflate(R.layout.list_item_found_wlan_data, arg2, false); 
     } 

     // Set text values to textViews in the item 
     TextView ssidTv = (TextView) rowView.findViewById(R.id.found_wlan_ssid_tv); 
     ssidTv.setText(mAccessPointlist.get(arg0).getSsid()); 

     TextView passwordTv = (TextView) rowView.findViewById(R.id.found_wlan_password_tv); 
     passwordTv.setText(mAccessPointlist.get(arg0).getPsk()); 

     return rowView; 
    } 

    @Override 
    public Filter getFilter() { 

     Filter filter = new Filter() { 

      @SuppressWarnings("unchecked") 
      @Override 
      protected void publishResults(CharSequence constraint, FilterResults results) { 

       mAccessPointlist = (List<WlanNetwork>) results.values; // has the filtered values 
       notifyDataSetChanged(); // notifies the data with new filtered values 
      } 

      @Override 
      protected FilterResults performFiltering(CharSequence constraint) { 
       FilterResults results = new FilterResults();  // Holds the results of a filtering operation in values 
       // We implement here the filter logic 
       if (constraint == null || constraint.length() == 0) { 
        Logger.d("Search Query empty, display all values"); 
        // No filter implemented we return all the list 
        results.values = FoundController.getAccessPointsList(); 
        results.count = FoundController.getAccessPointsList().size(); 
       } else { 
        Logger.d("Search query is: " + constraint.toString()); 
        // We perform filtering operation 
        filteredWlanList = new ArrayList<WlanNetwork>(); 

        for (WlanNetwork wlanNetwork : FoundController.getAccessPointsList()) { 
         if (wlanNetwork.getSsid().toUpperCase().startsWith(constraint.toString().toUpperCase())) { 
          Logger.d("Found"); 
          filteredWlanList.add(wlanNetwork); 
         } 
        } 
        Logger.d("Count is :"); 
        Logger.d(String.valueOf(filteredWlanList.size())); 
        results.values = filteredWlanList; 
        results.count = filteredWlanList.size(); 
       } 
       return results; 
      } 

     }; 
     return filter; 
    } 

} 

回答

-1

更改您的MainActivity代碼:

searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 

     @Override 
     public boolean onQueryTextSubmit(String s) { 
      Logger.d("onQueryTextSubmit "); 
      return false; 
     } 

     @Override 
     public boolean onQueryTextChange(String s) { 
      if (adapter != null) 
       adapter.getFilter().filter(s); 
      return false; 
     } 
    }); 
+0

不工作,適配器被定義爲: 私有靜態WlanNetwor kAdapter mAdapter; – redrom

+0

爲什麼你將它聲明爲私有靜態? –

+0

如果我移除靜態,則不會發生變化。不能在適配器中出現問題? – redrom