目录
一、保存状态值(一个地方保存)
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;
};
}