質問

Androidでは、どのように示す項目がListView値に基づいて動的に更新されているユーザの入力に基づいて、フィルタTextViewできますか?

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

-------------------------
| Text View             |
-------------------------
| List item             |
| List item             |
| List item             |
| List item             |
|                       |
|                       |
|                       |
|                       |
-------------------------
役に立ちましたか?

解決

まず、あなたがのEditText、とリストビューの両方を持つ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>

このリストビュー上で素敵なのEditTextで、適切にすべてをレイアウトします。次に、通常どおりListActivityを作成するのではなく、我々は最近宣言したレイアウトを使用するようsetContentView()方法でonCreate()呼び出しを追加します。我々はListViewで、特別android:id="@android:id/list"をID'edことを覚えておいてください。これは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を示すべきです。そのボックスが何かを作るために、我々はそれから入力を取り、その入力がリストをフィルタリングしておく必要があります。多くの人がこれを手動で行うことを試みたが、の最もListViewAdapterクラスは自動的にフィルタリングを実行するために使用することができFilterオブジェクトが付属しています。私達はちょうどEditTextにパイプにFilterからの入力を必要としています。それは非常に簡単ですが判明。クイックテストを実行するには、お使いのonCreate()コールに次の行を追加します。

adapter.getFilter().filter(s);

あなたがこの作品を作るために、変数にごListAdapterを保存する必要があります注意してください - 。私は、以前の「アダプター」と呼ばれる変数にから私のArrayAdapter<String>を保存している。

次のステップは、EditTextからの入力を取得することです。これは実際に思考のビットを取ります。あなたのOnKeyListener()EditTextを追加することができます。しかし、このリスナーは、のいくつかの重要なイベントのを受け取ります。ユーザーが「wyw」を入力した場合、予測テキストは、おそらく「目」をお勧めします。ユーザーが「wyw」または「目」のいずれかを選択するまで、あなたのOnKeyListenerは、キーイベントを受信しません。いくつかは、このソリューションを好むかもしれないが、私はそれがイライラました。私はすべてのキーイベントを望んでいたので、私はフィルタリングの選択肢を持っていたか、フィルタリングではありません。解決策はTextWatcherです。単純に作成してTextWatcherEditTextを追加し、ListAdapterを渡すたびにテキストの変更をフィルタ要求をFilterTextWatcherOnDestroy()を削除することを忘れないでください!ここでは、最終的な解決策は次のとおりです。

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);
}

他のヒント

プログラムの開発を実行すると、力の近くを引き起こします。

私はラインをswapedます:

  

アンドロイド:ID = "@ + building_list / search_box"

タグ付き
  

アンドロイド:ID = "@ + ID / search_box"

それが問題だろうか?以下のための '@ + building_list' とは何ですか?

私は、フィルタリングの問題を持っていました 結果がフィルタリングされていることが、を回復していないの!

は、フィルタリング(活動開始)前ので、私は、リストのバックアップを作成しました。.. (ちょうど別のリスト、同一のデータを含む)

フィルタリングに、フィルタ及びlistadapterがプライマリリストに接続されている。

が、フィルタ自体がバックアップさリストからのデータを使用する。

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

とにかく、このソリューションのおかげます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top