如何存储 recyclerview 数据,同时通过底部导航更改视图(片段)?
How to store recyclerview data , while changing view (Fragments) via Bottom Navigation?
我正在关注这个问题
我也找到了
How to save state of view class? and .
上下文
我在我的一个片段中以 DataModel
(实现 Parcelable) 形式向 recyclerview
提供数据。
使用底部导航和 ROOM DB
(获取和保存数据)。
我都做了什么
我在第一个 link 和我的代码中使用了代码。但是我看不懂第四段代码,里面用的是什么(我没有response.boddy()
, Error)。
无论如何,每次更改视图时 savedInstanceState = null
所以代码正在重做。
我想问什么
我不想每次通过底部导航更改视图时都重做?
我做错了什么,数据没有保存在 savedInstanceState
中?
我的片段视图
private ArrayList<DataModel> data;
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
root = inflater.inflate(R.layout.fragment_home, container, false);
currentContext = getContext();
recyclerView = (RecyclerView) root.findViewById(R.id.recyclerViewHome);
recyclerView.setHasFixedSize(true);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getContext());
recyclerView.setLayoutManager(layoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());
this.data = new ArrayList<>();
adapter = new CustomAdapter(data, currentContext, 1);
recyclerView.setAdapter(adapter);
if (savedInstanceState != null) {
// Retrieve the data you saved
data = savedInstanceState.getParcelableArrayList("saved_data");
//Call method to reload adapter record
recyclerViewsaveInstance(data);
}
else {
//No data to retrieve
dataAsynTask; //deleted, Basicly I get the data from DB, convert it to DataModel and give them to recyclerview.
}
return root;
}
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
Log.i("savedInstanceState", "loading");
savedInstanceState.putParcelableArrayList("saved_data", this.data);
super.onSaveInstanceState(savedInstanceState);
}
public void recyclerViewsaveInstance(ArrayList<DataModel> dataset)
{
this.data = dataset;
adapter = new CustomAdapter(dataset, getContext(), 1);
recyclerView.setAdapter(adapter);//notify adapter about the new record
adapter.notifyDataSetChanged();
}
我想你想在这里做的是将你的 AsyncTask
移到 Activity
水平,让你的 Fragment
向 Activity 询问 List<DataModel>
.
在你的 Fragment 的 onCreateView()
方法中,而不是写
this.data = new ArrayList<>();
然后检查savedInstanceState
并有条件地执行一个AsyncTask,你可以这样写:
this.data = ((MyActivity) getActivity()).getData();
然后,在您的 Activity 中,您将实现此 getData()
方法:
public List<DataModel> getData() {
if (data != null) {
return data;
} else {
// kick off AsyncTask here
return Collections.emptyList();
}
}
当 AsyncTask 完成时,更新 Activity 的 data
字段并通知 Fragment 有新数据可用。在片段中,你会有这样的方法:
public void onDataFetched(List<DataModel> data) {
this.data = data;
adapter.notifyDataSetChanged();
}
以上所有操作的最终结果是 Activity
现在负责加载数据和保存数据。 Fragment
对数据库或缓存一无所知;它只知道在显示数据时向 Activity
询问数据。
由于 Activity
在您使用底部导航在片段之间切换时保持活动状态,因此当您切换标签时它会成功地保持数据活动。
我正在关注这个问题
我也找到了
How to save state of view class? and
上下文
我在我的一个片段中以 DataModel
(实现 Parcelable) 形式向 recyclerview
提供数据。
使用底部导航和 ROOM DB
(获取和保存数据)。
我都做了什么
我在第一个 link 和我的代码中使用了代码。但是我看不懂第四段代码,里面用的是什么(我没有response.boddy()
, Error)。
无论如何,每次更改视图时 savedInstanceState = null
所以代码正在重做。
我想问什么
我不想每次通过底部导航更改视图时都重做?
我做错了什么,数据没有保存在 savedInstanceState
中?
我的片段视图
private ArrayList<DataModel> data;
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
root = inflater.inflate(R.layout.fragment_home, container, false);
currentContext = getContext();
recyclerView = (RecyclerView) root.findViewById(R.id.recyclerViewHome);
recyclerView.setHasFixedSize(true);
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getContext());
recyclerView.setLayoutManager(layoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());
this.data = new ArrayList<>();
adapter = new CustomAdapter(data, currentContext, 1);
recyclerView.setAdapter(adapter);
if (savedInstanceState != null) {
// Retrieve the data you saved
data = savedInstanceState.getParcelableArrayList("saved_data");
//Call method to reload adapter record
recyclerViewsaveInstance(data);
}
else {
//No data to retrieve
dataAsynTask; //deleted, Basicly I get the data from DB, convert it to DataModel and give them to recyclerview.
}
return root;
}
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
Log.i("savedInstanceState", "loading");
savedInstanceState.putParcelableArrayList("saved_data", this.data);
super.onSaveInstanceState(savedInstanceState);
}
public void recyclerViewsaveInstance(ArrayList<DataModel> dataset)
{
this.data = dataset;
adapter = new CustomAdapter(dataset, getContext(), 1);
recyclerView.setAdapter(adapter);//notify adapter about the new record
adapter.notifyDataSetChanged();
}
我想你想在这里做的是将你的 AsyncTask
移到 Activity
水平,让你的 Fragment
向 Activity 询问 List<DataModel>
.
在你的 Fragment 的 onCreateView()
方法中,而不是写
this.data = new ArrayList<>();
然后检查savedInstanceState
并有条件地执行一个AsyncTask,你可以这样写:
this.data = ((MyActivity) getActivity()).getData();
然后,在您的 Activity 中,您将实现此 getData()
方法:
public List<DataModel> getData() {
if (data != null) {
return data;
} else {
// kick off AsyncTask here
return Collections.emptyList();
}
}
当 AsyncTask 完成时,更新 Activity 的 data
字段并通知 Fragment 有新数据可用。在片段中,你会有这样的方法:
public void onDataFetched(List<DataModel> data) {
this.data = data;
adapter.notifyDataSetChanged();
}
以上所有操作的最终结果是 Activity
现在负责加载数据和保存数据。 Fragment
对数据库或缓存一无所知;它只知道在显示数据时向 Activity
询问数据。
由于 Activity
在您使用底部导航在片段之间切换时保持活动状态,因此当您切换标签时它会成功地保持数据活动。