160

ListViewAndroid では、表示される項目が値に基づいて動的に更新されるユーザー入力に基づいてフィルタリングするにはどうすればよいTextViewですか?

私はこのようなものを探しています:

-------------------------
| Text View             |
-------------------------
| List item             |
| List item             |
| List item             |
| List item             |
|                       |
|                       |
|                       |
|                       |
-------------------------
4

3 に答える 3

287

最初に、EditText と ListView の両方を持つ XML レイアウトを作成する必要があります。

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <!-- Pretty hint text, and maxLines -->
    <EditText android:id="@+building_list/search_box" 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="type to filter"
        android:inputType="text"
        android:maxLines="1"/>

    <!-- Set height to 0, and let the weight param expand it -->
    <!-- Note the use of the default ID! This lets us use a 
         ListActivity still! -->
    <ListView android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="0dip"
        android:layout_weight="1" 
         /> 

</LinearLayout>

これにより、ListView の上に適切な EditText が配置され、すべてが適切にレイアウトされます。次に、通常どおり ListActivity を作成しますがsetContentView()、メソッドに呼び出しを追加しonCreate()て、最近宣言したレイアウトを使用します。ListViewを特別に識別したことを思い出してくださいandroid:id="@android:id/list"。これにより、宣言されたレイアウトで使用したいListActivityものを知ることができます。ListView

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

        setContentView(R.layout.filterable_listview);

        setListAdapter(new ArrayAdapter<String>(this,
                       android.R.layout.simple_list_item_1, 
                       getStringArrayList());
    }

今すぐアプリを実行すると、以前ListViewの が表示され、上に素敵なボックスが表示されます。そのボックスに何かをさせるには、そこから入力を取得し、その入力をリストにフィルターをかける必要があります。多くの人がこれを手動で行おうとしましたが、ほとんどの ListView AdapterクラスにはFilter、フィルタリングを自動的に実行するために使用できるオブジェクトが付属しています。EditText入力を からにパイプするだけですFilter。それはとても簡単です。簡単なテストを実行するには、この行をonCreate()呼び出しに追加します

adapter.getFilter().filter(s);

ListAdapterこれを機能させるには、変数に保存する必要があることに注意してくださいArrayAdapter<String>。以前のデータを「adapter」という変数に保存しました。

次のステップは、 から入力を取得することEditTextです。これには、実際には少し考えが必要です。に を追加できOnKeyListener()ますEditText。ただし、このリスナーはいくつかの重要なイベントしか受信しません。たとえば、ユーザーが「wyw」と入力すると、予測テキストは「eye」を推奨する可能性があります。ユーザーが「wyw」または「eye」を選択するまで、OnKeyListenerキー イベントは受信されません。この解決策を好む人もいるかもしれませんが、私はイライラしていました。すべてのキー イベントが必要だったので、フィルタリングするかどうかを選択できました。解決策はTextWatcher. を作成して に追加しTextWatcher、テキストが変更されるたびEditTextに a フィルタ リクエストを渡すだけです。in !ListAdapter Filterを削除することを忘れないでください。最終的な解決策は次のとおりです。TextWatcherOnDestroy()

private EditText filterText = null;
ArrayAdapter<String> adapter = null;

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

    setContentView(R.layout.filterable_listview);

    filterText = (EditText) findViewById(R.id.search_box);
    filterText.addTextChangedListener(filterTextWatcher);

    setListAdapter(new ArrayAdapter<String>(this,
                   android.R.layout.simple_list_item_1, 
                   getStringArrayList());
}

private TextWatcher filterTextWatcher = new TextWatcher() {

    public void afterTextChanged(Editable s) {
    }

    public void beforeTextChanged(CharSequence s, int start, int count,
            int after) {
    }

    public void onTextChanged(CharSequence s, int start, int before,
            int count) {
        adapter.getFilter().filter(s);
    }

};

@Override
protected void onDestroy() {
    super.onDestroy();
    filterText.removeTextChangedListener(filterTextWatcher);
}
于 2009-11-15T09:04:30.850 に答える
10

プログラムを実行すると、強制的に終了します。

私は行を交換しました:

android:id="@+建物リスト/検索ボックス"

android:id="@+id/検索ボックス"

それが問題でしょうか?「@+Building_list」は何のためのものですか?

于 2010-02-07T13:23:37.403 に答える
4

フィルタリングに問題がありました。結果はフィルタリングされていますが、復元されていません

フィルタリングする前に(アクティビティの開始)、リストのバックアップを作成しました..(同じデータを含む別のリスト)

フィルタリングでは、フィルターとリストアダプターがプライマリ リストに接続されます。

ただし、フィルター自体はバックアップされたリストのデータを使用していました。

これにより、私の場合、リストがすぐに更新され、検索用語の文字を削除しても、すべての場合にリストが正常に復元されることが保証されました:)

とにかくこの解決策をありがとう。

于 2011-08-17T08:48:21.433 に答える