序
最近这段时间 ,北京的地铁真的是人挺少的 。
/**
* ┏┓ ┏┓
* ┏┛┻━━━┛┻┓
* ┃ ┃
* ┃ ━ ┃
* ┃ > < ┃
* ┃ ┃
* ┃... ⌒ ... ┃
* ┃ ┃
* ┗━┓ ┏━┛
* ┃ ┃ Code is far away from bug with the animal protecting
* ┃ ┃ 神兽保佑,代码无bug
* ┃ ┃
* ┃ ┃
* ┃ ┃
* ┃ ┃
* ┃ ┗━━━┓
* ┃ ┣┓
* ┃ ┏┛
* ┗┓┓┏━┳┓┏┛
* ┃┫┫ ┃┫┫
* ┗┻┛ ┗┻┛
*/
PS:最近是不是神兽偷懒了 ,各种小问题接连而至 。
问题描述(你可能不知道我经历了什么 !)
上效果图
哈哈哈 。使用 ExpandListVIew 控件写这个页面 ,复用 、复用 、复用 、复用 。需要复用没毛病吧 。
直接上子布局的伪代码
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
ItemHolder itemHolder;
if (convertView == null) {
convertView = LayoutInflater.from(mContext).inflate(R.layout.item_video_course_task_child, null);
itemHolder = new ItemHolder();
itemHolder.tv_homework = convertView.findViewById(R.id.tv_homework);
itemHolder.tv_courseware = convertView.findViewById(R.id.tv_courseware);
itemHolder.tv_introduction = convertView.findViewById(R.id.tv_introduction);
convertView.setTag(itemHolder);
} else {
itemHolder = (ItemHolder) convertView.getTag();
}
ClassroomLessonBean child = mChapterList.get(groupPosition).getTasks().get(childPosition);
// ...省略代码
// 概要
if (!TextUtils.isEmpty(child.getSummary())) {
itemHolder.tv_introduction.setVisibility(View.VISIBLE);
} else {
itemHolder.tv_introduction.setVisibility(View.GONE);
}
//课件
if (child.isHasExtraClass()) {
itemHolder.tv_courseware.setVisibility(View.VISIBLE);
} else {
itemHolder.tv_courseware.setVisibility(View.GONE);
}
// 作业
if (child.isHasHomework()) { // 作业增加状态 开始作业和继续学习和查看解析
itemHolder.tv_homework.setVisibility(View.VISIBLE);
} else {
itemHolder.tv_homework.setVisibility(View.GONE);
}
return convertView;
}
PS:上述代码是子 item 的复用代码逻辑 ,判断 contentView 是否为空 ,为空的话进行赋值然后 setTag () ,不为空的话就 getTag ()。下面的逻辑就是根据服务端反馈的数据进行有概要 、课件 、开始作业的隐藏显示 。(没毛病吧)
结果出现以下BUG 。
PS:哈哈哈 ,说实话 我一点儿也不慌 。
看这个 BUG 第一眼想到的是 Android 中 visibility 属性 VISIBLE 、 INVISIBLE 、GONE 的区别 (没毛病吧)。
VISIBLE:设置控件可见
INVISIBLE:设置控件不可见 (不可见但是仍占有空间)
GONE:设置控件隐藏
但是检测一遍代码之后 ,全都是 VISBLE 和 GONE ,没有使用 INVISIBLE 。
这是怎么回事 ?
分析一下:
讲真的 ,接下来我还是一点都不慌儿 ,因为我知道 ,一定是一个很小的问题 。在设置了 View 的 GONE 之后 ,View 隐藏了 ,但是View 所占有的空间还在 。我打印了当前 View 的状态 ,打印结果却是 GONE 。
这就很尴尬了 ,试想一下 ,一个 View 的状态是 GONE ,看不到这个 VIew ,但是其空间还在 。那就只有一个结果了 ,那就是当前页面给 VIew 设置完状态之后没有刷新 。
我试着调用了一下 contentView 的 requestLayout()方法 。完事 。
PS :本篇解决方案是 调用 contentVIew 的 requestLayout 方法 ,讲白了也就是跟无复用是一个道理 。
PS1:如果遇到同样问题的同行有其他见解欢迎评论回复 。(秒回)
如果感觉文章对您有帮助 ,可以关注我的公众号 SuperMaxs (如果有技术问题可以通过公众号加私人微信)。
个人Github 账号 :https://github.com/spuermax
唯有学习才是大势所趋 。