我创建了一个 Fragment
有一个ListView
有几个项目。根据我的计划,当我单击 ListView
上的其中一项时,我搬到另一个Fragment
, 从他们那里获取数据,用新数据替换原始数据并更新 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(); } }
我成功地从另一个 Fragment
获取了数据使用 onActivityResult()
方法,但我一直无法刷新 ListView
中的数据.
最佳答案
在您的 onActivityResult
中,您正在修改 itemRepeatAlarm
对象,但它不会在适配器中自动更新。
您需要从适配器获取对象并像这样设置它的值:
((TextOnlyItem) listAdapter.getItem(0)).setSubtitle(getString(R.string.on);
listAdapter.notifyDataSetChanged();
希望这能奏效。
关于Android:如何在 Fragment 中更改 ListView 项的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41467565/