0

ListView を含むレイアウトを作成しました。

この ListView 内に表示されるデータはそれほど複雑ではありません。ほとんどの場合、拡張されたアクティビティが開始されたときに渡される配列です。

行自体はアイコンとテキストの外に存在するため、ImageView と TextView です。ListView を埋めるために、ArrayAdapter を使用します。これは、表示する必要があるすべてのテキスト項目を含む配列が渡されるためです。

実際にそれらをフィルタリングできるようにしたいので、ListView xml 宣言に追加する android:textFilterEnabled パラメータを見つけました...検索フィールドがうまく表示されますが、いくつかの文字を入力するとフィルタリングされませんが、リスト全体を削除するだけです。これは、textfilter が何をフィルタリングする必要があるのか​​ わからないためであることがわかりました。

私の質問は次のとおりです。テキストフィルターに何をフィルターする必要があるかを伝える必要があることはわかっています。また、フィルター処理する必要があるテキストで配列がいっぱいになっているので、これら2つを結合するにはどうすればよいですか?

CursorAdapter を拡張する例を見てきましたが、ここでも Cursor がありません。DB を呼び出したくありません。データを使用して配列を再利用し、明らかに ArrayAdapter 自体を再利用して、データが画面上で適切に表示されます (つまり、ImageView と TextView レイアウトを使用)。

これはどのように行うことができますか?

4

2 に答える 2

2

カスタム アダプターは、Filterableインターフェイスを実装し、オーバーライドして、で拡張さgetFilter()れるクラスのインスタンスを返す必要があります。FiltergetFilter()

私が行った方法は、フィルタリング クラスのインスタンスを作成し、それをアダプター内のインスタンス変数に格納し、呼び出されfinalたときにそれを返すことでした。getFilter()

ソースコードを見てArrayAdapter、フィルタリングを自分で行う方法をよりよく理解してください。

于 2010-05-17T14:50:27.877 に答える
0

ListViewで Generics パラメータに「String」を使用してArrayAdapterを使用し(つまり、 で作成ArrayAdapter<String> ... = new ArrayAdapter<String>(...))、プログラムでsetTextFilterEnabledsetFilterTextを呼び出してそれらを除外することができました。以下は、私がListActivityでそれを行った方法です:

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);

    // This array list will be updated each time.
    final ArrayList<String> data = new ArrayList<String>();
    data.add("apple");
    data.add("orange");
    data.add("tomato");
    dataAdapter = new ArrayAdapter<String>(this, R.layout.item,
        R.id.itemName, data);

    setListAdapter(dataAdapter);
    ListView view = getListView();
    view.setTextFilterEnabled(true);
    view.setFilterText("ap");
}

また、非文字列ベースのアダプターで試してみました。結果のコードはhereから取得できます。この場合、 ListViewArrayAdapterに入れたいItemというオブジェクトを作成しました。オブジェクトのtoStringメソッドによって返されたものに対してフィルタリングします。この例では、アイテムの名前に対してtoStringフィルターをかけます。上記のケースとは異なり、説明したように、 setTextFilterEnabledを呼び出す代わりに、ビューの XML ファイルにandroid:textFilterEnabledプロパティを設定したことに注意してください。

于 2010-05-17T12:34:52.180 に答える