天天看點

BaseAdapter調用NotifyDataSetChanged不重新整理

記錄一個今天碰到的NotifyDataSetChanged不重新整理的問題,以及我的解決方法。

問題描述:GirdView顯示相冊,需要在進入編輯的時候,直接調用NotifyDataSetChanged重新整理界面為編輯狀态,進而每個格子上顯示一個删除圖示。但是當調用NotifyDataSetChanged後,界面死活不重新整理。但奇怪的是,我另一個控制器中同樣的實作方法,卻可以重新整理。

問題排查:

1、網上大部分所說的NotifyDataSetChanged重新整理機制,需要把資料源重新 list.addAll(newlist),但是沒有啥用。

2、在getView中,需要對每個item重新設定寬高,是以實作了以下代碼

@Override public View getView(final int position, View v, ViewGroup parent)
 {
     AlbumGirdItemHolder itemHolder = null;
     if (v == null) {
        v = mInflater.inflate(R.layout.view_lu_album_gird_item, parent, false);
        itemHolder = new AlbumGirdItemHolder(v);
        v.setTag(itemHolder);
        itemHolder.mFiletimeTextview.setVisibility(View.GONE);
     } 
     else {
        itemHolder = (AlbumGirdItemHolder) v.getTag();
     }

     //舊更新item代碼段三
     AbsListView.LayoutParams param = (AbsListView.LayoutParams)v.getLayoutParams();
     param.width = (parent.getWidth()-32)/3;
     param.height = param.width*11/16;
     v.setLayoutParams(param);

    //舊更新item比例代碼段二
    /*
    AbsListView.LayoutParams param = (AbsListView.LayoutParams)v.getLayoutParams();
    int width = (parent.getWidth()-8)/3;
    int height = width*11/16;
    if (param.width != width || param.height != height) {
        param.width = width;
        param.height = height;
        v.setLayoutParams(param);
    }
    */

    //舊更新item代碼段一
    /*
    int width = (parent.getWidth()-8)/3;
    AbsListView.LayoutParams param = new AbsListView.LayoutParams(
                width, width*11/16);
    v.setLayoutParams(param);

    */

}
           

 1、最開始,我是使用“舊更新item代碼段一”來更新item的寬高,調用NotifyDataSetChanged時,界面可以正常重新整理。但是不知道為啥,它會導緻我的第一個item界面異常(比如說圖檔通過Glide加載不出來)。在另一個fragment中實作的卻又沒問題。

2、是以就改成了“舊更新item代碼段二”,然後界面是正常了,但是當調用NotifyDataSetChanged時,界面一直不重新整理。此時按大家所說的嘗試重新list.addAll(newlist),也沒有啥效果。

3、就改成了“舊更新item代碼段三”,就正常了。

原理我不懂,也不深究,隻希望做個筆記,也希望對有同樣問題的朋友有所幫助。