1. ホーム
  2. android

[解決済み] AndroidでListViewを動的に更新する方法【非公開

2022-04-26 07:31:27

質問

Androidでは、どのようにすれば ListView に基づいて動的に更新されます。 TextView の値ですか?

このようなものを探しています。

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

解決方法は?

まず、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 オブジェクトを使用すると、自動的にフィルタリングを実行することができます。からの入力をパイプで送るだけです。 EditTextFilter . それはかなり簡単であることが判明した。簡単なテストを行うには、次の行をあなたの onCreate() コール

adapter.getFilter().filter(s);

を保存する必要があることに注意してください。 ListAdapter を変数に保存しています。 ArrayAdapter<String> を'adapter'という変数に格納しています。

次のステップでは、入力を EditText . これには、実はちょっとした工夫が必要です。この場合 OnKeyListener()EditText . しかし、このリスナーが受け取るのは 一部のキーイベント . 例えば、ユーザーが「wyw」と入力した場合、予測入力では「eye」が推奨される可能性が高いです。ユーザーが「wyw」または「eye」のどちらかを選択するまで、あなたの OnKeyListener はキーイベントを受け取りません。この方法を好む人もいるかもしれませんが、私は不満に感じました。私はすべてのキーイベントが欲しいので、フィルタリングするかしないかの選択を迫られました。この解決策は TextWatcher . を作成し、追加するだけです。 TextWatcherEditText を渡すと 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);
}