savedInstanceState保存与读取

本文介绍了如何在Android应用中使用自定义列表(ArrayList<Integer>)保存RecyclerView的选中状态,包括创建列表、转换数据格式、onSaveInstanceState中的操作,以及在onCreate和refreshList场景下的读取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、保存状态值(一个地方保存)

1.创建自定义保存列表

2.向自定义保存列表当中传入数据

3.向自定义保存列表当中传入数据(其中log打印数组的值进行测试)

4.outState.put方法获取其所需选中的列表进行保存

5.完整代码 如下:

二、读取状态值(两个地方读取)

1.在Oncreat开始创建任务时读取到列表

2.在refreshList刷新列表时读取-->读取出位置信息将对应item重新设置为选中状态


savedInstanceState

一、保存状态值(一个地方保存)

1.创建自定义保存列表

在列表需要保存选中状态值(列表形式)和读取选中状态值(列表形式)的情况下:
通过onSaveInstanceState的方法,保存;

自定义一个列表,类型适宜;如这里的自定义名:checkedPostions ,类型:Integer

--> ArrayList<Integer> checkedPostions = new ArrayList<Integer>();

2.向自定义保存列表当中传入数据

因为outState.put获取到的数组类型没有我这边的SparseBooleanArray类型,所以需要转换一次;

自定义SparseBooleanArray类型的,名字为positions的布尔数组;

对它进行相应的赋值操作:

--> SparseBooleanArray positions  = mRecyclerView.getCheckedItemPositions();

3.向自定义保存列表当中传入数据(其中log打印数组的值进行测试)

for (int i = 0; i < positions.size(); i++) {
    //Log.i(TAG, "CheckedItemIds key = : "+ positions.keyAt(i));
    //Log.i(TAG, "CheckedItemIds key = : "+ positions.get(positions.keyAt(i)));
    checkedPostions.add(positions.keyAt(i));
}

4.outState.put方法获取其所需选中的列表进行保存

outState.put方法可以获取其所需选中的列表进行保存,设置String类型的key,并传递给savedInstanceState;

--> outState.putIntegerArrayList("CheckedItemIds", checkedPostions);

5.完整代码 如下:

 //保存状态值
    @Override
    public void onSaveInstanceState(@NonNull Bundle outState) {
        //outState.putBundle("CheckedItemIds",mRecyclerView.getCheckedItemPositions());
        SparseBooleanArray positions  = mRecyclerView.getCheckedItemPositions();
        ArrayList<Integer> checkedPostions = new ArrayList<Integer>();
        for (int i = 0; i < positions.size(); i++) {
            Log.i(TAG, "CheckedItemIds key = : "+ positions.keyAt(i));
            Log.i(TAG, "CheckedItemIds key = : "+ positions.get(positions.keyAt(i)));
            checkedPostions.add(positions.keyAt(i));
        }

        outState.putIntegerArrayList("CheckedItemIds", checkedPostions);
        super.onSaveInstanceState(outState);
    }

二、读取状态值(两个地方读取)

1.在Oncreat开始创建任务时读取列表

因为在onSaveInstanceState保存状态的时候,outState.putIntegerArrayList()方法已经将数组传到了savedInstanceState中,所以直接读取就好;

防止空指针,对其进行判空操作:

if(savedInstanceState != null){

创建全局自定义读取列表listPositions  进行列表读取

private ArrayList<Integer> listPositions = new ArrayList<Integer>();
if(savedInstanceState != null){
    listPositions = savedInstanceState.getIntegerArrayList("CheckedItemIds");
    //for (int i = 0; i < listPositions.size(); i++) {
        //Log.i(TAG,"check tiem id = "+ listPositions.get(i));
    //}
}
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //读取状态值
        //ArrayList<Integer> listPositions = new ArrayList<Integer>();
        if(savedInstanceState != null){
            listPositions = savedInstanceState.getIntegerArrayList("CheckedItemIds");
            for (int i = 0; i < listPositions.size(); i++) {
                Log.i(TAG,"check tiem id = "+ listPositions.get(i));
            }
        }

    }

2.在refreshList刷新列表时读取-->读取位置信息将对应item重新设置为选中状态

//通过打印堆栈信息,发现列表刷新了多次

public void refreshList() {
        Log.w(TAG,Log.getStackTraceString(new Throwable()));

因为多次刷新列表,第一次并没有取到值,所以进行对task列表的不为空的判断,并且有item但没有指向的判断:--> tasks != null && !tasks.isEmpty()

防止空指针,对其进行判空操作:--> listPositions != null && listPositions.size() > 0)

if(tasks != null && !tasks.isEmpty() && listPositions != null && listPositions.size() > 0){

从listPositions列表中读取信息,并将对应item重新设置为选中状态(setItemChecked:选中状态)
    for (int i = 0; i < listPositions.size(); i++) {
        mRecyclerView.setItemChecked(listPositions.get(i),true);
    }
}
    public void refreshList() {
        Log.w(TAG,Log.getStackTraceString(new Throwable()));
        final boolean isSearchMode = !TextUtils.isEmpty(mSearchEdit.getText());
        if (mIsSearchMode != isSearchMode) {
            mEmptyText.setText(isSearchMode ? R.string.search_empty_str : R.string.todos_empty_str);
            mIsSearchMode = isSearchMode;
        }
        mTodoFilter.displayDoneTodo(shouldDisplayDone());
        mTodoFilter.search(mSearchEdit.getText().toString());
        mAdapter.search(mSearchEdit.getText().toString());
        List<TodoTask> tasks = TodoCache.getTodoTasks(mTodoFilter);
        mAdapter.refresh(tasks);
        requestNotificationIfNeeded(tasks);
//        Log.w(TAG,"refresh list ");
        //取出状态值
        if(tasks != null && !tasks.isEmpty() && listPositions != null && listPositions.size() > 0 && state){
            Log.w(TAG,"restore list states ");
            for (int i = 0; i < listPositions.size(); i++) {
                mRecyclerView.setItemChecked(listPositions.get(i),true);
            }
            state = false;
        };

    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值