今天在项目开发中遇到一个很奇怪的问题,给GridView设置了适配器,然后刷新数据的时候界面没有任何变化,好长时间没有想到为什么,最后在网上找到了答案,本来代码是这样写的。
private GridView mMovie_gridview;
private List<MovieInfo.MovieBean> mData;
private MovieAdapter mMovieAdapter;
private SimpleDraweeView mIv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Fresco.initialize(this);
setContentView(R.layout.activity_main);
mData = new ArrayList<>();
mMovie_gridview = (GridView) findViewById(R.id.movie_gridview);
mMovieAdapter = new MovieAdapter(this,mData,R.layout.movie_item_layout);
mMovie_gridview.setAdapter(mMovieAdapter);
创建了一个List集合用来存放数据,然后在请求成功以后,给集合赋值,让adapter刷新
@Override
public void onResponse(Call<MovieInfo> call, Response<MovieInfo> response) {
MovieInfo movieInfo = response.body();
mData = movieInfo.results;
mMovieAdapter.notifyDataSetChanged();
}
后来才明白这样写是错的,因为原来我们使用的是最开始的集合作为数据源设置给了adapter,注意,此时集合中还是没有数据的,当我们访问网络成功以后,我们又把一个新的集合的引用赋值给了原来的集合,此时原来的集合的指向就变成了新的集合,但是我们的adapter的数据源还是原来的那个集合,内容是空的,所以我们刷新的时候没作用。
那莫应该怎么做呢?我们只要保证只有一个集合的引用存在就可以了,代码如下
@Override
public void onResponse(Call<MovieInfo> call, Response<MovieInfo> response) {
MovieInfo movieInfo = response.body();
mData.addAll(movieInfo.results);
mMovieAdapter.notifyDataSetChanged();
}
此时就可以刷新界面了,最后给大家上一张运行结果图
由于网络原因,部分图片未加载出来,不过我们的界面确实刷新了。