33

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

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

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

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

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

4

10 に答える 10

30

実際には、アダプターで 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);
于 2010-07-20T03:55:53.800 に答える
28

オリジナルを直接変更してから、他のアダプターのようにList呼び出すことはできません。これは、オリジナルを保持しないためです。notifyDataSetChanged()List

ただし、次のように、アダプター自体を使用して同じ結果を得ることができます。

spinnerAdapter.clear();
spinnerAdapter.addAll(updatedListData);
spinnerAdapter.notifyDataSetChanged(); // optional, as the dataset change should trigger this by default

user392117 からのこの回答に基づいています。

編集:デフォルトでは、リストを変更するメソッドがadd()自動的remove()に呼び出されます (setNotifyOnChange(boolean) の Android 開発者向けドキュメントをnotifyDataSetChanged()参照してください) 。

public void setNotifyOnChange (boolean notifyOnChange)

リストを変更するメソッド (add、addAll(java.util.Collection)、addAll(java.lang.Object[])、insert、remove、clear、sort(java.util.Comparator)) が自動的に notifyDataSetChanged を呼び出すかどうかを制御します。false に設定されている場合、呼び出し元は手動で notifyDataSetChanged() を呼び出して、添付されたビューに変更を反映させる必要があります。デフォルトは true で、notifyDataSetChanged() を呼び出すとフラグが true にリセットされます。

notifyDataSetChanged()そのため、毎回電話する必要はありません。これが事実であることがわかった場合は、 setNotifyOnChange(true) を使用できます

spinnerAdapter.setNotifyOnChange(true); //only need to call this once
spinnerAdapter.add(Object); //no need to call notifyDataSetChanged()
于 2017-02-05T22:04:34.023 に答える
13

setAdapter() を 1 回呼び出すだけで、adapter.notifyDataSetChanged( )を呼び出してデータを更新できます。

于 2010-07-19T17:27:18.707 に答える
11

リスト内のデータを変更した場合、およびスピナーを更新したい場合は、

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

幸運を祈ります。

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

于 2012-01-01T13:00:22.720 に答える
4

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

typeList = adapter.getList(); //array list with the values
// change the values, and then
adapter.notifyDataSetChanged();
于 2010-07-19T17:26:07.070 に答える
2

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

typeList = dbAdapter.getList()              
adapter = new ArrayAdapter<String>(v.getContext(),
    android.R.layout.simple_spinner_dropdown_item,typeList);            
groupSpinner.setAdapter(adapter);
于 2014-02-25T17:04:23.513 に答える
2

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

   list.clear();
  list.add("A");
      list.add("B");
  dataAdapter.notifyDataSetChanged();
于 2012-03-25T10:48:39.287 に答える
1

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

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

typeList.clear();
typeList.addAll(dbAdapter.getList());
于 2015-05-27T16:18:57.577 に答える