記錄一個今天碰到的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代碼段三”,就正常了。
原理我不懂,也不深究,隻希望做個筆記,也希望對有同樣問題的朋友有所幫助。