【问题标题】:How To Save State Of RecyclerView Checkbox On Screen Rotation如何在屏幕旋转时保存 RecyclerView 复选框的状态
【发布时间】:2026-01-07 10:30:01
【问题描述】:

在屏幕旋转时,选定的项目被取消选择,我想保存它的状态。 我在 recyclerView 中有所有这些表单,点击时会被选中。这是 onListItemClick 中的代码

 private void onListItemClick(View view, int position) {
        Cursor cursor = instanceAdapter.getCursor();
        cursor.moveToPosition(position);

        CheckBox checkBox = view.findViewById(R.id.checkbox);
        checkBox.setChecked(!checkBox.isChecked());

        long id = cursor.getLong(cursor.getColumnIndex(InstanceProviderAPI.InstanceColumns._ID));

        if (selectedInstances.contains(id)) {
            selectedInstances.remove(id);
        } else {
            selectedInstances.add(id);
        }
        Bundle bundle=new Bundle();
        sendButton.setEnabled(selectedInstances.size() > 0);

        toggleButtonLabel();
    }

其中 selectedInstances 是 LinkedHashSet

private LinkedHashSet<Long> selectedInstances;

这是动图

【问题讨论】:

    标签: android android-recyclerview android-checkbox screen-rotation linkedhashset


    【解决方案1】:

    除非您可以将其存储在数据库或任何“持久”的东西中,否则您可以只保留一个布尔值列表/数组,其中包含与您的 ListView 一样多的条目。当您选中第二个复选框时,设置 array[1] = true。

    然后在您的适配器中,您只需检查当前项目的列表位置状态。

    举个例子

    boolean[] checkedState = new boolean[list.count];
    
    private void onListItemClick(View view, int position) {
        //...
        checkedState[position] = //checked state
    }
    
    //adapter
    
    public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, int position) {
        //...
    
        checkBox.isChecked = checkedState[position]
    }
    

    【讨论】:

      【解决方案2】:

      ViewModel 存储不会在应用轮换时销毁的 UI 相关数据。

      【讨论】:

        【解决方案3】:

        关于保持 UI 状态,您可以使用活动对象的 onSaveInstanceState() 和 onRestoreInstanceState 方法将数据保存在 Bundle 类型参数中,如下所示:

        protected void onSaveInstanceState(Bundle state) {
             super.onSaveInstanceState(state);
             String setting; 
             state.putString("KeyName", setting);
        }
        
        protected void onRestoreInstanceState(Bundle state) {
             super.onRestoreInstanceState(state);
             String setting; 
             setting = state.getString("KeyName");
        }
        

        根据 Android 开发人员文档,最正确的方法是持久化该数据,因此当应用完成然后再次启动时,应用可以从本地存储中检索该数据。

        它可以是 SharedPreferencesRoom 数据库,具体取决于数据的复杂性。就像数据是设置一样,所以我相信您会希望在完成应用时存储一个,并在再次启动应用时检索一个。

        参考资料:

        1. Saving UI States
        2. SharedPreferences
        3. Save key-value data
        4. Save data in a local database using Room
        5. RoomDatabase
        6. Android Jetpack: Room
        7. What’s New in Room (Android Dev Summit '19)

        【讨论】:

          最近更新 更多