Перерисовать Android Spinner
У меня есть элемент вращающегося устройства 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());
}
3 ответа
Вы можете просто обновить spinner
adapter
- дайте ему знать, какой элемент помечен, когда пользователь нажимает на значок звезды (звездочка.setOnClickListener
...). Что бы я сделал:
- При построении адаптера вы передаете только список полей "Имя", без значка (все по умолчанию не помечены)
- Вы добавляете отдельную функцию к адаптеру, чтобы установить помеченный элемент
(setStarred(String name))
- При первом вызове вызвать
setStarred
установить начальный выбор (если есть) - в звезде
setOnClickListener
реализация, вызовsetStarred
для помеченного элемента на адаптере, который вы получаете как(MySpinnerAdapter)spinner.getAdapter()
Или просто попробуйте:
spinner.setSelection(getActiveSelection().getSpinnerPosition(),true);
Это помогло мне обновить спиннер...
Вам нужно позвонить notifyDataSetChanged()
на вашем адаптере счетчика, когда ваши данные изменились.