アンドロイドスピナーを再描画する
-
14-11-2019 - |
質問
Android のスピナー項目があり、その行は TextView と ImageView (ユーザーが特定の項目をお気に入りとしてマークしたことを示す星) で構成されています。ここで、ユーザーがアイテムをお気に入りに追加したときに、スピナー リストのそのアイテムの横に星を表示したいので、更新された画像を表示するためにスピナーを再描画したいと思います。どうすればいいでしょうか?
私が今やっていることは、適切な画像を使用してまったく新しいスピナーを作成していることです。これにより、スピナーが選択した項目をリストの最初の項目に設定することになりますが、これは面倒です。同じままにしておきたいのです。私が試してみました
spinner.setSelection(selectedItem);
これは、実際に必要な番号 (現在選択されている項目の位置) 以外の任意の番号に対して機能し、選択したスピナー項目をリストの最初に再度設定します。
それで:リスト全体を再作成せずに、更新された情報でリストを再描画するにはどうすればよいですか。または、リストを再作成してもスピナー項目の選択を保持するにはどうすればよいですか?
明確にするために:これが私がやっていることです
// Callback for "favourite"-button
star.setOnClickListener(new ImageButton.OnClickListener() {
@Override
public void onClick(View arg0) {
// Toggle favourite
getActiveSelection().setStarred(getActiveSelection().isStarred() ? false : true);
reloadText();
createSpinner();
}
});
private void createSpinner() {
spinner = ((Spinner)findViewById(R.id.spinner));
ArrayList<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>();
HashMap<String, Object> map = new HashMap<String, Object>();
// Populate spinner item list
for(int i=0; i<N; i++) {
SpinnerItem item = getSpinnerItem(i);
map = new HashMap<String, Object>();
map.put("Name", item.getName());
map.put("Icon", (item.isStarred() ? "On" : "Off"));
list.add(map);
}
MySpinnerAdapter aspn = new MySpinnerAdapter(this, list,
R.layout.spinner, new String[] { "Name", "Icon" },
new int[] { R.id.spinnerrow, R.id.spinnerrowicon });
spinner.setAdapter(aspn);
spinner.setSelection(getActiveSelection().getSpinnerPosition());
}
解決
アップデートするだけでもいいかもしれません spinner
adapter
- ユーザーがスター アイコン (star.setOnClickListener
...)。私ならどうするか:
- アダプターの構築では、「名前」フィールドのリストのみを渡します。アイコンは必要ありません(デフォルトではすべてにスターが付いていません)。
- スター付きアイテムを設定するにはアダプターに別の機能を追加します
(setStarred(String name))
- 最初の呼び出しで、
setStarred
初期選択を設定します (存在する場合) - 星で。
setOnClickListener
実装、呼び出しsetStarred
として入手したアダプターの星付きアイテムの場合(MySpinnerAdapter)spinner.getAdapter()
他のヒント
またはただ試してみる:
spinner.setSelection(getActiveSelection().getSpinnerPosition(),true);
.
それは私がスピナーを更新するために働いた...
データが変更されたときにスピナーアダプタのnotifyDataSetChanged()
を呼び出す必要があります。
所属していません StackOverflow