動的にAndroid上でリストビューを更新する方法[閉じ]
-
20-09-2019 - |
質問
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
を示すべきです。そのボックスが何かを作るために、我々はそれから入力を取り、その入力がリストをフィルタリングしておく必要があります。多くの人がこれを手動で行うことを試みたが、の最ものListView
のAdapter
クラスは自動的にフィルタリングを実行するために使用することができFilter
オブジェクトが付属しています。私達はちょうどEditText
にパイプにFilter
からの入力を必要としています。それは非常に簡単ですが判明。クイックテストを実行するには、お使いのonCreate()
コールに次の行を追加します。
adapter.getFilter().filter(s);
あなたがこの作品を作るために、変数にごListAdapter
を保存する必要があります注意してください - 。私は、以前の「アダプター」と呼ばれる変数にから私のArrayAdapter<String>
を保存している。
次のステップは、EditText
からの入力を取得することです。これは実際に思考のビットを取ります。あなたのOnKeyListener()
にEditText
を追加することができます。しかし、このリスナーは、のいくつかの重要なイベントのを受け取ります。ユーザーが「wyw」を入力した場合、予測テキストは、おそらく「目」をお勧めします。ユーザーが「wyw」または「目」のいずれかを選択するまで、あなたのOnKeyListener
は、キーイベントを受信しません。いくつかは、このソリューションを好むかもしれないが、私はそれがイライラました。私はすべてのキーイベントを望んでいたので、私はフィルタリングの選択肢を持っていたか、フィルタリングではありません。解決策はTextWatcher
です。単純に作成してTextWatcher
にEditText
を追加し、ListAdapter
を渡すたびにテキストの変更をフィルタ要求をFilter
。 TextWatcher
でOnDestroy()
を削除することを忘れないでください!ここでは、最終的な解決策は次のとおりです。
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がプライマリリストに接続されている。
が、フィルタ自体がバックアップさリストからのデータを使用する。
これはリストがすぐに更新されたとしても、リストを検索タームの文字を削除するには、すべての場合には正常に復元されることを、私の場合には保証:)
とにかく、このソリューションのおかげます。