自訂 ArrayAdapter 若未正確實作 Filterable,呼叫 getFilter().filter() 將無效果。需覆寫 performFiltering 與 publishResults。
public class MyAdapter extends BaseAdapter implements Filterable {
private List originalData;
private List filteredData;
private LayoutInflater inflater;
public MyAdapter(Context context, List data) {
this.originalData = new ArrayList<>(data);
this.filteredData = new ArrayList<>(data);
this.inflater = LayoutInflater.from(context);
}
@Override public int getCount() { return filteredData.size(); }
@Override public Object getItem(int pos) { return filteredData.get(pos); }
@Override public long getItemId(int pos) { return pos; }
@Override
public View getView(int pos, View convertView, ViewGroup parent) {
// ... 正常 getView 邏輯 ...
}
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
List list = new ArrayList<>();
if (constraint == null || constraint.length() == 0) {
list.addAll(originalData);
} else {
String prefix = constraint.toString().toLowerCase();
for (String item : originalData) {
if (item.toLowerCase().startsWith(prefix)) {
list.add(item);
}
}
}
results.values = list;
results.count = list.size();
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
filteredData.clear();
filteredData.addAll((List) results.values);
notifyDataSetChanged();
}
};
}
}
originalData 作為完整資料來源。performFiltering 在背景執行緒執行,不可操作 UI。publishResults 在主執行緒執行,更新 filteredData 並通知適配器。adapter.getFilter().filter(keyword) 即可觸發過濾。