Android:如何在Fragment中更改ListView项的值?

3

我创建了一个Fragment,其中包含一个带有多个项目的ListView。根据我的计划,当我点击ListView上的其中一项时,我会移动到另一个Fragment,从中获取数据,替换原始数据并更新ListView。为了实现这一点,我编写了以下代码。

  1. Code inside the onCreateView() method

    listAdapter = new AlarmOptionItemListAdapter();
    lvAlarmOptionList = (ListView) view.findViewById(R.id.lvAlarmOptionList);
    initializeListItems();
    lvAlarmOptionList.setAdapter(listAdapter);
    
  2. The initializeListItems() method that adds several items to lvAlarmOptionList, the ListView instance.

    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);
    }
    
  3. onActivityResult() method that gets the data from the other Fragment and modify the items on the 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;
        }
    }
    }
    
  4. And finally, the onResume() method

    @Override
    public void onResume() {
        super.onResume();
        if(listAdapter != null) {
            listAdapter.notifyDataSetChanged();
        }
    }
    

我成功地使用onActivityResult()方法从另一个Fragment中获取数据,但是我一直无法刷新ListView中的数据。


1
你不应该从你的代码中调用 Android 的回调函数(例如 onResume)。 - Divers
2个回答

1
在你的onActivityResult中,你正在修改itemRepeatAlarm对象,但它在适配器中不会自动更新。你需要从适配器中获取该对象并设置其值,如下所示:
((TextOnlyItem) listAdapter.getItem(0)).setSubtitle(getString(R.string.on);
listAdapter.notifyDataSetChanged();

希望这个有效。

0

我认为你的问题在于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);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接