0
我有以下類正在過濾onQueryTextChange上的調用。問題是找到的結果不會在找到的結果列表中更新。例如,我有名單(見圖像的下方。):Android:適配器中的過濾器不起作用
我進查詢「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;
}
}
不工作,適配器被定義爲: 私有靜態WlanNetwor kAdapter mAdapter; – redrom
爲什麼你將它聲明爲私有靜態? –
如果我移除靜態,則不會發生變化。不能在適配器中出現問題? – redrom