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

标签 android listview android-fragments notifydatasetchanged

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

  1. onCreateView() 内的代码方法

    listAdapter = new AlarmOptionItemListAdapter();
    lvAlarmOptionList = (ListView) view.findViewById(R.id.lvAlarmOptionList);
    initializeListItems();
    lvAlarmOptionList.setAdapter(listAdapter);
    
  2. 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);
    }
    
  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();
        }
    }
    

我成功地从另一个 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/

相关文章:

java - Android Leanback - 如何添加 DetailsOverviewRow 操作图标

java - 如何创建自定义 Android Listview 标题并将它们分组为几天

android - 回到 FragmentActivity 后出现 IllegalStateException

android - 如何为 ListView 行创建类似列的布局?

Android 从数据库中替换 Listview 中的 html 实体

android - 使用打开的日期 DialogueFragment 在方向更改时强制关闭

java - Android 选项卡式 Activity - 将微调器值从嵌套 fragment 传递到父 Activity 中的选项卡 fragment

java - Android Tabbed Activity,想太多了吗?

java - Android 动态删除处理程序 postDelayed

android - 每当更改设备方向时,SurfaceView 都会重新启动视频