Я создал Fragment
, у которого есть ListView
с несколькими пунктами. Согласно моему плану, когда я нажимаю один из элементов на ListView
, я перехожу к другому Fragment
, получаю данные от них, заменяю исходные данные на новый и обновляю ListView
. Для этого я написал код следующим образом.Android: Как изменить значение элемента ListView во фрагменте?
Код внутри
onCreateView()
методаlistAdapter = new AlarmOptionItemListAdapter(); lvAlarmOptionList = (ListView) view.findViewById(R.id.lvAlarmOptionList); initializeListItems(); lvAlarmOptionList.setAdapter(listAdapter);
initializeListItems()
метода, который добавляет несколько элементов вlvAlarmOptionList
, вListView
экземпляре.private void initializeListItems() { itemRepeatAlarm = new TextOnlyItem(); itemRepeatAlarm.setTitle(getString(R.string.repeat_weekly)); itemRepeatAlarm.setSubtitle(getString(R.string.never)); listAdapter.addItem(itemRepeatAlarm); itemAlarmLock = new TextOnlyItem(); itemAlarmLock.setTitle(getString(R.string.alarm_lock)); itemAlarmLock.setSubtitle(getString(R.string.choose_option)); listAdapter.addItem(itemAlarmLock); }
onActivityResult()
метод, который получает данные из другойFragment
и изменять элементы наListView
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if(resultCode == RESULT_OK && data != null) { switch(requestCode) { case CODE_PIN: String value = data.getStringExtra(Keys.VALUE); if(value != null) { Log.i(ApplicationManager.LOG, "PIN set to " + value); } break; case CODE_PASSWORD: String password = data.getStringExtra(Keys.VALUE); if(password != null) { Log.i(ApplicationManager.LOG, "Password set to " + password); } break; case CODE_REPEAT: repeatType = data.getIntExtra(Keys.REPEAT_TYPE, 0); switch(repeatType) { case Keys.SINGLE: case Keys.PLURAL: Toast.makeText(activity, data.getStringExtra(Keys.REPEAT_MESSAGE), Toast.LENGTH_SHORT).show(); itemRepeatAlarm.setSubtitle(getString(R.string.on)); listAdapter.notifyDataSetChanged(); onResume(); break; case Keys.NO_REPEAT: Toast.makeText(context, getString(R.string.alarm_will_never_repeat), Toast.LENGTH_SHORT).show(); itemRepeatAlarm.setSubtitle(getString(R.string.never)); listAdapter.notifyDataSetChanged(); onResume(); break; case Keys.EVERY_DAY: Toast.makeText(context, getString(R.string.alarm_will_repeat_every_day), Toast.LENGTH_SHORT).show(); itemRepeatAlarm.setSubtitle(getString(R.string.every_day)); listAdapter.notifyDataSetChanged(); onResume(); break; } break; case CODE_PATTERN: pattern = data.getStringExtra(Keys.VALUE); if(pattern != null) { Log.i(ApplicationManager.LOG, "Pattern set to " + pattern); } itemAlarmLock.setSubtitle(getString(R.string.pattern)); listAdapter.notifyDataSetChanged(); onResume(); break; } } }
И, наконец,
onResume()
метод@Override public void onResume() { super.onResume(); if(listAdapter != null) { listAdapter.notifyDataSetChanged(); } }
I управляемый t o успешно переносить данные из другого Fragment
с использованием метода onActivityResult()
, но я не могу обновить данные в ListView
.
Вы никогда не должны вызывать обратные вызовы андроида (например, 'onResume') из вашего кода. – Divers