gpt4 book ai didi

android - 如何在 onSaveInstanceState 上存储 recyclerview 数据

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:16:48 29 4
gpt4 key购买 nike

我想将来自 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com