这是一篇被领导骂的血泪史。记得要写全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判断来解决互斥问题。