ListView的動態重新整理問題——用notifyDataSetChanged沒作用
阿新 • • 發佈:2018-12-31
今天在專案開發中遇到一個很奇怪的問題,給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();
}
此時就可以重新整理介面了,最後給大家上一張執行結果圖
由於網路原因,部分圖片未加載出來,不過我們的介面確實重新整理了。