首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android ListView 自訂 Adapter 過濾功能失效:正確實作 Filterable 介面

     編輯:程式設計綜合問答

自訂 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 並通知適配器。
  • Activity 中呼叫 adapter.getFilter().filter(keyword) 即可觸發過濾。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved