1. ホーム
  2. android

[解決済み] リストビューフィルタ Android

2023-01-29 19:19:48

質問

アンドロイドでリストビューを作成しましたが、リストの上に編集テキストを追加し、ユーザーがテキストを入力すると、リストはユーザーの入力に応じてフィルタリングされるようにしたいです。

アンドロイドのリストアダプターをフィルタリングする方法があるかどうか、どなたか教えていただけませんか?

どのように解決するのですか?

リストビューの.xmlレイアウトファイルの上にEditTextを追加します。 そして、アクティビティ/フラグメントに....

lv = (ListView) findViewById(R.id.list_view);
    inputSearch = (EditText) findViewById(R.id.inputSearch);

// Adding items to listview
adapter = new ArrayAdapter<String>(this, R.layout.list_item, R.id.product_name,    products);
lv.setAdapter(adapter);       
inputSearch.addTextChangedListener(new TextWatcher() {

    @Override
    public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
        // When user changed the Text
        MainActivity.this.adapter.getFilter().filter(cs);
    }

    @Override
    public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { }

    @Override
    public void afterTextChanged(Editable arg0) {}
});

ここでの基本は OnTextChangeListener を追加し、そのコールバックメソッド内でリストビューのアダプタにフィルタを適用することです。

編集

自作のBaseAdapterにフィルタを適用するためには フィルタブル インターフェイスを実装する必要があります。

class CustomAdapter extends BaseAdapter implements Filterable {

    public View getView(){
    ...
    }
    public Integer getCount()
    {
    ...
    }

    @Override
    public Filter getFilter() {

        Filter filter = new Filter() {

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

                arrayListNames = (List<String>) results.values;
                notifyDataSetChanged();
            }

            @Override
            protected FilterResults performFiltering(CharSequence constraint) {

                FilterResults results = new FilterResults();
                ArrayList<String> FilteredArrayNames = new ArrayList<String>();

                // perform your search here using the searchConstraint String.

                constraint = constraint.toString().toLowerCase();
                for (int i = 0; i < mDatabaseOfNames.size(); i++) {
                    String dataNames = mDatabaseOfNames.get(i);
                    if (dataNames.toLowerCase().startsWith(constraint.toString()))  {
                        FilteredArrayNames.add(dataNames);
                    }
                }

                results.count = FilteredArrayNames.size();
                results.values = FilteredArrayNames;
                Log.e("VALUES", results.values.toString());

                return results;
            }
        };

        return filter;
    }
}

内部 performFiltering() の内部では、検索クエリとデータベースの値を実際に比較する必要があります。これはその結果を publishResults() メソッドに渡します。