モデル オブジェクト データの配列があり、カスタム ArrayAdapter のモデル オブジェクト配列からリストビューにテキストと画像を表示しています。
Androidの連絡先ビューのように、検索機能を実装したいです。
モデルオブジェクトからのデータを表示するカスタムアダプターのフィルターを実装する方法を教えてください。
サンプルの例のリンクまたはコードのスニペットも問題ありません。
基になるコレクションをフィルタリングする必要があります(このように:Javaコレクションをフィルタリングするための最良の方法は何ですか?)
フィルタ条件が変更された場合、データセットが変更されたことを通知し、フィルタされたリストインスタンスを使用して、エントリの量と個々のビューを提供します。
元のリストを複製するアプローチは実際には好きではありません。時間もメモリも消費します。欲しいものは見えるようにし、いらないものは無くすというアプローチを取りました。私の例は、TableRows をフィルタリングする TableLayout の場合で、それぞれに TextView があります。
public void filter(TableLayout tl, String regex) {
TableRow tr;
TextView tv;
Pattern p;
Matcher m;
p = Pattern.compile(regex);
int n = tl.getChildCount();
for(int i = 0; i < n; i++) {
tr = (TableRow) tl.getChildAt(i);
tv = (TextView) tr.getChildAt(0);
m = p.matcher(tv.getText());
if(m.find()) {
tr.setVisibility(View.VISIBLE);
} else {
tr.setVisibility(View.GONE);
}
}
私はそれをプロファイリングしませんでしたが、リストのすべての要素をコピーしてからフィルタリングしてから新しいリストを表示するよりも高速であると確信しています。
リストが大きくなるにつれて、利点がより顕著になるはずです。
ただし、警告として、数百行のフィルタリングは非常にうまく機能しますが、行数が多すぎてフィルタリングに 5 秒以上かかるとどうなるか心配です。次に、アプリが応答していないダイアログをトリガーする必要があります。
スレッドにしようとしましたが、ビューの可視性を直接扱っているため、元のスレッドのみがビューにアクセスできるというエラー メッセージが表示されます。私はそれに取り組んでおり、解決策を見つけると確信しています。