Android: 如何改变Fragment中ListView项的值?
Android: How to change ListView item's value in Fragment?
我创建了一个 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();
}
}
我成功地使用onActivityResult()
方法从另一个Fragment
获取数据,但我一直无法刷新ListView
中的数据。
我认为您的问题是 onCreateView 在 onActivityResult 之后执行,因此您的项目将使用旧值重新创建。
试试这个或类似的东西:
private void initializeListItems() {
if (null == itemRepeatAlarm) {
itemRepeatAlarm = new TextOnlyItem();
itemRepeatAlarm.setTitle(getString(R.string.repeat_weekly));
itemRepeatAlarm.setSubtitle(getString(R.string.never));
listAdapter.addItem(itemRepeatAlarm);
}
if (null == itemAlarmLock) {
itemAlarmLock = new TextOnlyItem();
itemAlarmLock.setTitle(getString(R.string.alarm_lock));
itemAlarmLock.setSubtitle(getString(R.string.choose_option));
listAdapter.addItem(itemAlarmLock);
}
}
在您的 onActivityResult
中,您正在修改 itemRepeatAlarm
对象,但它不会在适配器中自动更新。
您需要从适配器获取对象并像这样设置它的值:
((TextOnlyItem) listAdapter.getItem(0)).setSubtitle(getString(R.string.on);
listAdapter.notifyDataSetChanged();
希望这有效。
我创建了一个 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(); } }
我成功地使用onActivityResult()
方法从另一个Fragment
获取数据,但我一直无法刷新ListView
中的数据。
我认为您的问题是 onCreateView 在 onActivityResult 之后执行,因此您的项目将使用旧值重新创建。 试试这个或类似的东西:
private void initializeListItems() {
if (null == itemRepeatAlarm) {
itemRepeatAlarm = new TextOnlyItem();
itemRepeatAlarm.setTitle(getString(R.string.repeat_weekly));
itemRepeatAlarm.setSubtitle(getString(R.string.never));
listAdapter.addItem(itemRepeatAlarm);
}
if (null == itemAlarmLock) {
itemAlarmLock = new TextOnlyItem();
itemAlarmLock.setTitle(getString(R.string.alarm_lock));
itemAlarmLock.setSubtitle(getString(R.string.choose_option));
listAdapter.addItem(itemAlarmLock);
}
}
在您的 onActivityResult
中,您正在修改 itemRepeatAlarm
对象,但它不会在适配器中自动更新。
您需要从适配器获取对象并像这样设置它的值:
((TextOnlyItem) listAdapter.getItem(0)).setSubtitle(getString(R.string.on);
listAdapter.notifyDataSetChanged();
希望这有效。