记录一个今天碰到的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代码段三”,就正常了。
原理我不懂,也不深究,只希望做个笔记,也希望对有同样问题的朋友有所帮助。