Item 复用之后 ,设置 View的 GONE 无效果 (ExpandListVIew 复用问题)。

最近这段时间 ,北京的地铁真的是人挺少的 。

 

/**
 *         ┏┓   ┏┓
 *        ┏┛┻━━━┛┻┓
 *        ┃       ┃
 *        ┃   ━   ┃
 *        ┃ >   < ┃
 *        ┃       ┃
 *        ┃... ⌒ ... ┃
 *        ┃       ┃
 *        ┗━┓   ┏━┛
 *          ┃   ┃ 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

 

 

唯有学习才是大势所趋 。

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值