当前位置: 首页>前端>正文

saveinstancestate用法 savedinstances怎么用

目录

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

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;
        };

    }

https://www.xamrdz.com/web/2uf1942489.html

相关文章: