安卓开发请写全if-else,visiable-gone!!

这是一篇被领导骂的血泪史。记得要写全if-else

场景一:视频资源,比如一部电影,它有许多属性,比如:年份、导演、类型、主演等。现在需求要求,当属性字段不为空时,不显示此字段。

这个需求,第一印象是很简单,我判断下是否为空,不空就显示;为空就隐藏掉。

所以,有了第一版本的Java代码如下:

if (TextUtils.isEmpty(movieBean.year)) {
	holder.publicYearTxt.setVisibility(View.GONE);
} else {
	holder.publicYearTxt.setText(holder.context.getString(R.string.publish_year, movieBean.year));
}

然后就出问题了!!!

当遇到一次年份字段为空时,TextView被设置成隐藏;即使下一个视频资源含这个字段,也不会显示,除非重启应用,XML布局默认是显示该字段的。

所以,有了第二版本的Java代码,修复后如下:

if (TextUtils.isEmpty(movieBean.year)){
	holder.publicYearTxt.setVisibility(View.GONE);
} else {
	holder.publicYearTxt.setVisibility(View.VISIBLE);
	holder.publicYearTxt.setText(holder.context.getString(R.string.publish_year, movieBean.year));
}

场景二:视频资源有大标题和小标题,而有的视频只有大标题。需求,对大小标题进行显示。

布局文件写法:

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="72dp"
        android:layout_centerVertical="true"
        android:layout_marginEnd="11dp"
        android:layout_toEndOf="@+id/fl_program"
        android:background="@drawable/background_widget_layout_border"
        android:paddingStart="@dimen/dp20">

        <TextView
            android:id="@+id/widget_name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginEnd="27dp"
            android:layout_marginTop="10dp"
            android:ellipsize="end"
            android:maxLines="1"
            android:text="湖人对战勇士"
            android:textColor="#000000"
            android:textSize="13sp" />

        <TextView
            android:id="@+id/widget_sub_name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_marginEnd="27dp"
            android:maxLines="1"
            android:ellipsize="end"
            android:text="直播挂件副标题"
            android:textSize="10sp"
            android:textColor="#848494"/>

        <TextView
            android:id="@+id/widget_play_time"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_marginBottom="11dp"
            android:layout_marginEnd="27dp"
            android:text="比赛时间 :2018.01.13 15:40"
            android:textSize="10sp"
            android:textColor="#848494"/>

    </RelativeLayout>

然后在代码里定义:

if (!TextUtils.isEmpty(widgetItem.confrontTeamName)) {
    holder.widgetSubnameTv.setText(widgetItem.confrontTeamName);
}

当时想法:既然子标题可能为空,那么不为空时再赋值呗。“完美”!然后就报Bug!!!

测试一个单子打醒自己。

当没有子标题时,界面上会显示“直播挂件副标题”几个大字。。。。

修改后的代码:

if (!TextUtils.isEmpty(widgetItem.confrontTeamName)) {
	holder.widgetSubnameTv.setText(widgetItem.confrontTeamName);
	holder.widgetSubnameTv.setVisibility(View.VISIBLE);
} else {
	holder.widgetSubnameTv.setVisibility(View.INVISIBLE);
}

场景三:是的,还有场景三。需求是“搜索过的历史”为流式布局,自动换行,一行放的元素个数也是自适应。效果如下图:

然后,长按某个元素可以进行删除。问题出现在删除操作上。当不断增加时,其高度不断在增加(根据它的行数)。具体实现可见另一博客:仿各APP搜索历史的实现(greendao+流式布局)

当删除时,高度不会随着行数的减小而降低。此时的代码实现如下:

historyGroupViewHolder.searchViewGroup.addView(textView);
            //添加完子控件后,判断是否需要显示更多按钮
            historyGroupViewHolder.searchViewGroup.post(new Runnable() {
                @Override
                public void run() {
                    if (historyGroupViewHolder.searchViewGroup.isTwoFlag()) {
                        ViewGroup.LayoutParams layoutParams = historyGroupViewHolder.searchViewGroup.getLayoutParams();
                        layoutParams.height = UiUtil.dp2px(84);
                        historyGroupViewHolder.searchViewGroup.setLayoutParams(layoutParams);
                    }
                    if (historyGroupViewHolder.searchViewGroup.isFlag()) {
                        ViewGroup.LayoutParams layoutParams = historyGroupViewHolder.searchViewGroup.getLayoutParams();
                        layoutParams.height = UiUtil.dp2px(130);
                        historyGroupViewHolder.searchViewGroup.setLayoutParams(layoutParams);
//                        historyGroupViewHolder.showMoreLayout.setVisibility(View.VISIBLE);
                    }
                    if (historyGroupViewHolder.searchViewGroup.moreFlag){
                        historyGroupViewHolder.showMoreLayout.setVisibility(View.VISIBLE);
                    } else{
                        historyGroupViewHolder.showMoreLayout.setVisibility(View.GONE);
                    }
                }
            });

是一个代码执行顺序问题!!也是一个调用逻辑的问题。

上述代码只是在添加完元素后,进行了ViewGroup的高度更新,而删除时并没有调用。所以,需要调用两次。

第一次:添加后调用

historyGroupViewHolder.searchViewGroup.addView(textView);
//添加完子控件后,判断是否需要显示更多按钮
updateViewGroupHeight(historyGroupViewHolder);

第二次:删除后调用

historyGroupViewHolder.searchViewGroup.removeView(v);
 //如果没有子控件了,则整个ItemView不显示,回调处理
if (historyGroupViewHolder.searchViewGroup.getChildCount() == 0) {
     nullChildViewCallBack.refreshDataAndUpdateItem();
} else {
      updateViewGroupHeight(historyGroupViewHolder);
}

目前修改的代码只解决了一半的问题,高度的更新并不能采用之前的实现。updateViewGroupHeight()方法的核心逻辑代码如下:

if (historyGroupViewHolder.searchViewGroup.isFlag()) {  // >=3
                    ViewGroup.LayoutParams layoutParams = historyGroupViewHolder.searchViewGroup.getLayoutParams();
                    layoutParams.height = UiUtil.dp2px(130);
                    historyGroupViewHolder.searchViewGroup.setLayoutParams(layoutParams);
//                        historyGroupViewHolder.showMoreLayout.setVisibility(View.VISIBLE);
                } else if (historyGroupViewHolder.searchViewGroup.isTwoFlag()) {    // >=2
                    ViewGroup.LayoutParams layoutParams = historyGroupViewHolder.searchViewGroup.getLayoutParams();
                    layoutParams.height = UiUtil.dp2px(84);
                    historyGroupViewHolder.searchViewGroup.setLayoutParams(layoutParams);
                } else {        // = 1
                    ViewGroup.LayoutParams layoutParams = historyGroupViewHolder.searchViewGroup.getLayoutParams();
                    layoutParams.height = UiUtil.dp2px(42);
                    historyGroupViewHolder.searchViewGroup.setLayoutParams(layoutParams);
                }

之前,各各if判断是并列的且不互斥,显然,ViewGroup的最终高度取决于最后一个为真的if判断。这固然不是合理的。使用if-else判断来解决互斥问题。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值