Android:ListView,同时在旋转/配置更改后记住并忘记其getCheckedItemPosition

标签 android android-listview android-configchanges

我真的无法弥补,所以如果有任何提示,我将不胜感激。我必须在这里犯一些错误(4.1.2)。

我有一个 Activity,它在 onCreate() 中为 ListView 项目设置了一个子类 ArrayAdapter它呈现为 Checkable ViewGroup

Activity 已经利用 NonConfiguration 机制在方向改变时重新构建适配器。但是,它目前没有存储 ListViewgetCheckedItemPosition(),因为我觉得它没有必要(详情如下)。

有趣的是,我观察到的是以下内容。

  • Activity 已呈现。
  • 用户检查 ListView 项。
  • ListView 项目显示为选中状态。
  • onItemClickListenerListView 调用 getCheckedItemPosition() 并获得正确的结果。
  • 用户更改屏幕方向。
  • onCreate() 重新构建“ListView”并像以前一样显示(在 onCreate() 之后;见下文)。
  • onCreate() 调用 getCheckedItemPosition() 并获取 -1,尽管 ListView 显示正确检查的项目

经过进一步检查,出现了以下细节。

  • onCreate():
    • 获取ListView资源
    • 构建MyAdapter
    • MyAdapter设置为ListView的适配器
    • getCheckedItemPosition() 返回 -1
  • onCreate() 之后:
    • MyAdapter.getView() 正在被调用
    • CheckableViewGroup.setChecked() 使用正确的 checked 值调用
    • 将对所有项目重复最后两个步骤

如前所述,我依赖于 View 对象在分配了 ID 后保存其状态的 Android 功能。我会说是这种情况,因为必须有一些对象可以为所有列表条目设置正确的 checked 状态。 (顺便说一下,CheckableViewGroup 也覆盖了 on{Save,Restore}InstanceState() 但无论是否分配了 ID 都不会调用它(大概是因为它永远不会附加到布局根?)。

所以它看起来好像 ListView 同时知道和不知道它的 getCheckedItemPosition()?还是我走错了路?

public final class MyActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.my_activity);
        itemList = (ListView)findViewById(R.id.ma_list);
        listAdapter = new MyAdapter();
        itemList.setAdapter(listAdapter);
        itemList.setOnItemClickListener(
            new OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> av, View v, int pos, long id) { checkForm(); }
            }
        );
        listAdapterSetup();
        // this is where itemList.getCheckedItemPosition() returns -1
        // when the listView has been re-built from NonConfiguration data:
        checkForm(); 
    }
}

最佳答案

我在发布我的问题后进行了另一次测试,因为我在描述我的观察时有了一个想法。

的确,我的怀疑得到了证实。

时机是关键

ListView 将在 onResume()(但不是之前)中报告正确的 getCheckedItemPosition() 值。

因此解决方案很简单:在 onResume() 中执行任何评估逻辑。

关于Android:ListView,同时在旋转/配置更改后记住并忘记其getCheckedItemPosition,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14875642/

相关文章:

带有来自 URL 和 TextView 的 ImageView 的 Android ListView

Android SDK 位置 vs 构建服务器,如何设置?

android - 使用 Firebase for Android 更新特定值

java - 根据条件计算项目总数

Android - 仅在智能手机中强制方向

android - ActivityInfo.SCREEN_ORIENTATION_LOCKED 未锁定方向 - Android

onConfigurationChange 方法中的 Android 语言更改

java - 通过Android开发扩展类的不同方式?

java - Dagger 2错误 "android.app.Application cannot be provided without an @Inject constructor or from an @Provides-annotated method"

android - 将数据库的每一行映射到 ListView 的每一行