Android=でスピナーを動的に更新しようとしていますが、何も試みていません。
これは、スピナーの更新に使用している次のコードです。
typeList = dbAdapter.getList(); //array list with the values
adapter.notifyDataSetChanged();
groupSpinner.postInvalidate();
groupSpinner.setAdapter(adapter);
TypeListの値は正しいですが、Spinnerで更新されていません。
実際には、アダプターでclear/addを呼び出すか、新しいアダプターを作成して設定する必要があります。アダプターはリストへの参照を保持しないため(作成時にリストのtoArrayを呼び出すだけです)、それ自体を更新する方法はありません。
dataAdapter = new ArrayAdapter<String>(this, Android.R.layout.simple_spinner_item, newStringList);
dataAdapter.setDropDownViewResource(Android.R.layout.simple_spinner_dropdown_item);
spinnerCategory.setAdapter(dataAdapter);
元のList
を保持しないため、他のアダプタと同様に、元のList
を変更してnotifyDataSetChanged()
を呼び出すだけではできません。ただし、次のように、アダプタ自体を使用して同じ結果を得ることができます。
spinnerAdapter.clear();
spinnerAdapter.addAll(updatedListData);
spinnerAdapter.notifyDataSetChanged(); // optional, as the dataset change should trigger this by default
user392117からの回答に基づく( https://stackoverflow.com/a/38738734/1508887 )
データを更新するには、setAdapter()を1回呼び出すだけで、 adapter.notifyDataSetChanged() を呼び出す必要があります。
リストのデータが変更され、スピナーを更新したい場合
アダプターの新しいオブジェクトを作成し、そのアダプターをスピナーに設定します。それは確かに動作します。
幸運を祈ります。
編集:また、アダプターでnotifyDataSetChanged()を呼び出す必要があります。
タイプミスはありますか?これがdbAdapter
とadapter
の違いです。 Spinnerにすでにアダプターがある場合は、アダプターを再割り当てする必要はありません。さらに、あなたがしなければならないのは、アダプタを更新してnotifyDataSetChanged
メソッドを呼び出すことだけです。
typeList = adapter.getList(); //array list with the values
// change the values, and then
adapter.notifyDataSetChanged();
データを変更したら、次のコードを追加する必要があります。
typeList = dbAdapter.getList()
adapter = new ArrayAdapter<String>(v.getContext(),
Android.R.layout.simple_spinner_dropdown_item,typeList);
groupSpinner.setAdapter(adapter);
基になるデータを変更し、アダプターのnotifyDataSetChanged()を呼び出します。
list.clear();
list.add("A");
list.add("B");
dataAdapter.notifyDataSetChanged();
アダプターでadd/removeを使用し、notifyDataSetChanged()を使用すると、新しいアダプターを何度も作成する必要がなくなります。
アダプターをグローバルに宣言する
ArrayAdapter<Object> adapter;
オブジェクトのリストに何かを追加する場合、アダプターが接続されている(文字列または使用する任意のオブジェクト)アダプターに追加関数を追加し、notifyDataSetChangedを呼び出します。
adaper.add(Object);
adapter.notifyDataSetChanged();
また、リストからアイテムを削除する場合は、以下も追加します。
adapter.remove(Object);
adapter.notifyDataSetChanged();
どうやらtypeList = dbAdapter.getList()
を実行した後、変数typeList
は、最初にアダプターに提供したリストではなく、別のリストを指しているため、アダプターは多少混乱します。
したがって、次のコードを使用する必要があります。
typeList.clear();
typeList.addAll(dbAdapter.getList());
スピナーアダプターをセットアップするときに、
spinnerAdapter.setNotifyOnChange(true);
その後、新しいデータを追加すると、自動的に更新されます。