1. 程式人生 > >ListView的動態重新整理問題——用notifyDataSetChanged沒作用

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();
            }

此時就可以重新整理介面了,最後給大家上一張執行結果圖
這裡寫圖片描述

由於網路原因,部分圖片未加載出來,不過我們的介面確實重新整理了。