web-dev-qa-db-ja.com

スピナーを動的に更新する方法は?

Android=でスピナーを動的に更新しようとしていますが、何も試みていません。

これは、スピナーの更新に使用している次のコードです。

typeList = dbAdapter.getList(); //array list with the values

adapter.notifyDataSetChanged();
groupSpinner.postInvalidate();
groupSpinner.setAdapter(adapter);

TypeListの値は正しいですが、Spinnerで更新されていません。

27
2Real

実際には、アダプターで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);
22
AdamC

元の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

15
Fifer Sheep

データを更新するには、setAdapter()を1回呼び出すだけで、 adapter.notifyDataSetChanged() を呼び出す必要があります。

12
Robby Pond

リストのデータが変更され、スピナーを更新したい場合

アダプターの新しいオブジェクトを作成し、そのアダプターをスピナーに設定します。それは確かに動作します。

幸運を祈ります。

編集:また、アダプターでnotifyDataSetChanged()を呼び出す必要があります。

8
Dharmendra

タイプミスはありますか?これがdbAdapteradapterの違いです。 Spinnerにすでにアダプターがある場合は、アダプターを再割り当てする必要はありません。さらに、あなたがしなければならないのは、アダプタを更新してnotifyDataSetChangedメソッドを呼び出すことだけです。

typeList = adapter.getList(); //array list with the values
// change the values, and then
adapter.notifyDataSetChanged();
4
Cristian

データを変更したら、次のコードを追加する必要があります。

typeList = dbAdapter.getList()              
adapter = new ArrayAdapter<String>(v.getContext(),
    Android.R.layout.simple_spinner_dropdown_item,typeList);            
groupSpinner.setAdapter(adapter);
1
codingForFun

基になるデータを変更し、アダプターのnotifyDataSetChanged()を呼び出します。

   list.clear();
  list.add("A");
      list.add("B");
  dataAdapter.notifyDataSetChanged();
1
Kapil D

アダプターでadd/removeを使用し、notifyDataSetChanged()を使用すると、新しいアダプターを何度も作成する必要がなくなります。

アダプターをグローバルに宣言する

ArrayAdapter<Object> adapter;

オブジェクトのリストに何かを追加する場合、アダプターが接続されている(文字列または使用する任意のオブジェクト)アダプターに追加関数を追加し、notifyDataSetChangedを呼び出します。

adaper.add(Object);
adapter.notifyDataSetChanged();

また、リストからアイテムを削除する場合は、以下も追加します。

adapter.remove(Object);
adapter.notifyDataSetChanged();
0
no-name

どうやらtypeList = dbAdapter.getList()を実行した後、変数typeListは、最初にアダプターに提供したリストではなく、別のリストを指しているため、アダプターは多少混乱します。

したがって、次のコードを使用する必要があります。

typeList.clear();
typeList.addAll(dbAdapter.getList());
0
kgao

スピナーアダプターをセットアップするときに、

spinnerAdapter.setNotifyOnChange(true);

その後、新しいデータを追加すると、自動的に更新されます。

0
toshkinl