作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想将来自 API 的数据保存在 RecyclerView 中,以便在旋转屏幕时不会重新加载
我想我可以使用 onSaveInstanceState 但仍然不太明白如何使用它
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
final RecyclerView rvTVShow = view.findViewById(R.id.rv_shows);
rvTVShow.setHasFixedSize(true);
rvTVShow.setLayoutManager(new LinearLayoutManager(getActivity()));
ApiInterface apiService =
ApiClient.getClient().create(ApiInterface.class);
Call<MovieResponse> call = apiService.getTVShow(API_KEY);
call.enqueue(new Callback<MovieResponse>() {
@Override
public void onResponse(@NonNull Call<MovieResponse> call, @NonNull Response<MovieResponse> response) {
final List<Movies> movies = Objects.requireNonNull(response.body()).getResults();
TvShowAdapter tvShowAdapter = new TvShowAdapter(movies , R.layout.list_movies);
rvTVShow.setAdapter(tvShowAdapter);
....
}
最佳答案
我将在重构您的代码时解释 savedInstanceState 的工作原理。
首先:为它创建一个全局 Movie 对象和一个 Adapter
List<Movies> movies = new ArrayList();
TvShowAdapter tvShowAdapter = null;
在 onCreate Activity 下重新初始化适配器
tvShowAdapter = new TvShowAdapter(movies , R.layout.list_movies);
rvTVShow.setAdapter(tvShowAdapter);
创建一个处理电影的新方法数据人口
public void populateRV(List<Movies> movies)
{
this.movies = movies;
//notify adapter about the new record
tvShowAdapter.notifyDataSetChanged();
}
在响应回调下将数据插入 Movies 对象
movies = Objects.requireNonNull(response.body()).getResults();
populateRV(movies);
每次 Activity 的方向发生变化时,Android 都会通过重绘 View 来重置所有 View 的状态。这会导致非持久性数据丢失。但在重绘 View 之前,它会调用方法 onSavedInstanceState
因此,我们可以通过使用 android 提供的已定义的 onSavedInstanceState 方法保存 View 的状态来防止状态丢失。
在您的 Activity 的覆盖的 onSavedInstanceState 方法中添加以下 block
//this saves the data to a temporary storage
savedInstanceState.putParcelableArrayList("movie_data", movies);
//call super to commit your changes
super.onSaveInstanceState(savedInstanceState);
接下来是方向改变完成后恢复数据
在您的 onCreate Activity 中添加以下 block ,并确保它在初始化您的适配器之后出现
//...add the recyclerview adapter initialization block here before checking for saved data
//Check for saved data
if (savedInstanceState != null) {
// Retrieve the data you saved
movies = savedInstanceState.getParcelableArrayList("movie_data");
//Call method to reload adapter record
populateRV(movies);
} else {
//No data to retrieve
//Load your API values here.
}
关于android - 如何在 onSaveInstanceState 上存储 recyclerview 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57230396/
我是一名优秀的程序员,十分优秀!