java - 旋转显示时Recyclerview丢失数据,按下按钮Android时加载数据
问题描述
对不起,我的英语不好
我的问题:当我旋转我的应用程序时,所有数据都丢失了,我正在使用一个ViewModel
,当我按下按钮时我的数据加载,这是我的测试代码。
https://github.com/elviss116/androidMvvm-master
这是片段:
public class MovieListFragment extends Fragment {
private MovieListViewModel mViewModel;
private List<MovieModel.DataModel> movieList = new ArrayList<>();
private RecyclerView recyclerView;
private MoviesAdapter mAdapter;
private Button cargar;
public static MovieListFragment newInstance() {
return new MovieListFragment();
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
View view= inflater.inflate(R.layout.movie_list_fragment, container, false);
recyclerView = (RecyclerView)view.findViewById(R.id.recycler_view);
cargar = view.findViewById(R.id.btnCargar);
mAdapter = new MoviesAdapter(movieList);
RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getContext());
recyclerView.setLayoutManager(mLayoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setAdapter(mAdapter);
return view;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
cargar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mViewModel = ViewModelProviders.of(MovieListFragment.this).get(MovieListViewModel.class);
mViewModel.init();
mViewModel.getMovies().observe(MovieListFragment.this, new Observer<MovieModel>() {
@Override
public void onChanged(@Nullable MovieModel movieModels) {
movieList.addAll(movieModels.getData());
mAdapter.notifyDataSetChanged();
}
});
}
});
}
}
这是 ViewModel :
public class MovieModel {
@SerializedName("data")
List<DataModel> data;
public List<DataModel> getData() {
return data;
}
public void setData(List<DataModel> data) {
this.data = data;
}
public class DataModel {
@SerializedName("name")
String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
}
这是适配器:
public class MoviesAdapter extends RecyclerView.Adapter<MoviesAdapter.MyViewHolder> {
private List<MovieModel.DataModel> moviesList;
public class MyViewHolder extends RecyclerView.ViewHolder {
public TextView name;
public MyViewHolder(View view) {
super(view);
name = (TextView) view.findViewById(R.id.name);
}
}
public MoviesAdapter(List<MovieModel.DataModel> moviesList) {
this.moviesList = moviesList;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.movie_list_row, parent, false);
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
MovieModel.DataModel movie = moviesList.get(position);
holder.name.setText(movie.getName());
}
@Override
public int getItemCount() {
return moviesList.size();
}
}
解决方案
当您旋转手机时,活动会被破坏并重新创建,这就是您看到数据消失的原因。
我推荐的是在点击监听器之外创建活动时抓取并观察视图模型。这样片段在旋转时会立即开始观察数据,但只有在单击按钮时才会初始化。
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mViewModel = ViewModelProviders.of(MovieListFragment.this).get(MovieListViewModel.class);
mViewModel.getMovies().observe(MovieListFragment.this, new Observer<MovieModel>() {
@Override
public void onChanged(@Nullable MovieModel movieModels) {
movieList.addAll(movieModels.getData());
mAdapter.notifyDataSetChanged();
}
});
cargar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mViewModel.init();
}
});
}
推荐阅读
- javascript - Webpack 构建生成带有空文件的代码
- firebase - react-native 的 Firebase 查询帮助
- scala - 双向运算符
- java - 根据波动数量的条件过滤列表
- apache-spark - 使用来自 Kafka 的数据时如何跳过多行记录中的标题?
- python - 如何从 sqlalchemy @validate 装饰器中捕获 Flask 中的异常
- angular - 从引导顶部角度材料完全迁移的最佳方法是什么
- php - 存储更改并稍后检索会话表单数据
- angular - 使用 Angular 指定 Google Places 自动完成的起始位置
- reactjs - 使用回调将按钮向下传递给组件