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

Android: How to change ListView item's value in Fragment?

我创建了一个 Fragment,其中有一个 ListView 有几个项目。根据我的计划,当我单击 ListView 上的一项时,我移动到另一个 Fragment,从中获取数据,用新数据替换原始数据并更新 ListView.为此,我编写了如下代码。

  1. onCreateView() 方法中的代码

    listAdapter = new AlarmOptionItemListAdapter();
    lvAlarmOptionList = (ListView) view.findViewById(R.id.lvAlarmOptionList);
    initializeListItems();
    lvAlarmOptionList.setAdapter(listAdapter);
    
  2. initializeListItems() 方法将多个项目添加到 lvAlarmOptionListListView 实例。

    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()方法从另一个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;
        }
    }
    }
    
  4. 最后,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();

希望这有效。