ListView的动态刷新问题——用notifyDataSetChanged没作用

今天在项目开发中遇到一个很奇怪的问题,给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();
            }

此时就可以刷新界面了,最后给大家上一张运行结果图
ListView的动态刷新问题——用notifyDataSetChanged没作用_第1张图片

由于网络原因,部分图片未加载出来,不过我们的界面确实刷新了。

你可能感兴趣的:(ListView的动态刷新问题——用notifyDataSetChanged没作用)