工作日志(2017-12)

     2017 的最后一个月, 再加把劲.

Monday 4th

     1. 我去, 这个坑爹的 DialogFragment 居然会弹出两次.
     项目中经常会有这种需求, 点击删除按钮, 弹出一个对话框, (这里对话框的实现 google 官方推荐使用 DialogFragment), 然后点击确定按钮, 删除.
     通常是没有什么问题, 但是如果是 RecyclerView 中的一项, 可能就会出问题了. 连续点击按钮, 弹出多个对话框. 然后对话框都点击删除按钮, 会出现异常; 而且如果是列表的最后一项, 那么直接 crash. 抛出一个 IndexOutOfBoundException.
     目前的解决办法是通过处理按钮的点击事件, 以及列表集合的判断来处理这个问题.

Tuesday 7th

     2. ConstraintLayout 布局使用的大坑.
     使用 ConstraintLayout 时, 子 View 一定要使用约束. 比如说, 如果是宽度充满整个屏幕, 那么使用如下宽度指定为 0dp, 配合约束使用, 可以正确显示, 否则现实的时候就很可能出现意想不到的问题.
     举个例子, 我们要做一个 RecyclerView 的分页加载功能. 我们先这样指定布局文件, 添加一个背景, 便于观察.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// 布局文件.
<android.support.constraint.ConstraintLayout
..
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</android.support.constraint.ConstraintLayout>
// RecyclerView 每一个 item 的布局文件
// 省略无关代码.
<android.support.constraint.ConstraintLayout
..
<android.support.v7.widget.AppCompatTextView
android:id="@+id/item_title"
android:layout_width="match_parent"
android:layout_height="wrap_content" ../>
<android.support.v7.widget.AppCompatTextView
android:id="@+id/item_detail"
android:layout_width="match_parent"
android:layout_height="wrap_content" ... />
</android.support.constraint.ConstraintLayout>



     很明显得看到了问题所在了吧, 现在我们添加约束.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<android.support.constraint.ConstraintLayout ..>
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
// 相应的 item 布局也做修改.
// 重复就不贴出来了.

     然后再看一下效果.



     这个样子显示就完全正确了. 很不好意思的说, 被这个东西卡了将近一天的时间, 元气大伤.

Monday 11th 月曜日

     3. RecyclerView 和 Adapter 可以通过代理的方式添加新的功能.
     比如说, 我们现在需要做一个分页加载.
     按照我们传统的写法应该是, 自己写一个 CustomeAdapter 然后继承系统的 Adapter, 然后在其中添加, 分页的相关逻辑以及原来的逻辑. 这个样子实现是没有什么问题, 但是耦合程度太高, 分页的逻辑和原来的逻辑偶合在一起, 难以复用和维护. 实在是一个非常 low 的实现方式.
     其实我一直也是这么写的, 但是代理模式让我刷新了三观, 让我知道原来的是现实多么的 low-b.
     我们可以定义一个 ProxyAdapter 作为代理. 大体的样式如下.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class ProxyAdapter extends RecyclerView.Adapter{
RecyclerView.Adapter adapter;
ProxayAdapter(RecyclerView.Adapter adapter){
this.adapter = adapter;
// .. exceptions judgement.
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
// ... return different holder, but I'd like to omit them.
return adapter.onCreateViewHolder(parent, viewType);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position){
// ... add logical of page loading
adapter.onBindViewHolder(holder, posiiton);
}
@Override
public int getItemCount(){
// may be one more than the count. What a lazy guy I am!
return adapter.getItemCount();
}
static class ProxyViewHolder extends RecyclerView.ViewHolder{
// .. omit the views
ProxyViewHolder(View itemView){
super(itemview);
}
}
}

     大体的思路就是这个样子, 具体的代码就不贴了. 观其大略即可.

     4. 注意一下 RecyclerViewonBindViewHolder(RecyclerView.ViewHolder holder, int position)onBindViewHolder(RecyclerView.ViewHolder holder, int position, List<Object> payLoads) 的区别.
     一不小心看错了就坑爹了, 细节性的问题, 千万注意, 如果说不知道这两个方法的区别, 谷歌或者度娘吧.

Friday 15th 金曜日

     5. 实在是忍不住吐槽一下 ,为什么我遇到的都是些奇葩需求. 昨天是 Android 的电子秤, 今天是打印机. 我只想静静地当一个程序员, 怎么就那么难呢..
     好吧, 我也是服气了, 同一个串口, 同一时间只能是一个进程读取数据, 如果多个线程同时读取数据, 那么就会出现数据错误的情况…

Monday 18th 月曜日 

     6. 真的是让硬件交互给坑死了, 条码打印机和票据打印机区别是很大的, 这个坑害得老子踩了两天.

Tuesday 19th 火曜日

     7. 绘制一个类似于这个样子的布局, 你会怎么选择呢? 三个按钮, 动态的切换左侧的 Fragment 布局.



     之前选择的是 RecyclerView 的方式实现, 现在就换一下, 反正就是三个按钮, 以后也不会再多了, 索性直接用 TextView + ConstraintLayout 拼接完成.
     第一个坑, 看到上面有一条白线了么? 并不是刻意而为之, 二是我也不知道怎么回事儿, 还是求高手解答.
     第二个坑, 看到那条虚线了么? 如果是用 RecyclerView 的话, 直接实现 DivideItemDecoration 就可以了. 现在用一个 shape.xml 来实现就可以了, .xml 可能看起来像是这个样子.

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="line">
<stroke
android:width="1dp"
android:color="@color/gray_a3adbd"
android:dashGap="3dp"
android:dashWidth="10dp" />
</shape>

     但是, 显示不出来, 为什么呢? 因为你在 View 中引用时, View 的高度需要大于线的高度, 也就是 Viewheight 需要大于 shapewidth; 好吧, 我们把 View 的高度设置为 1.5dp.
     但但是, 显示出来一条实线. why? 因为这个在硬件加速的环境下不好使, 关掉. 给 View 增加属性 android:layerType="software". 然后显示正常.
     但但但是, 以后如果是三个选项及其以上的选项, 一定要使用 RecyclerView 可以节省很多时间.

Friday 22th 金曜日

     8. TextViewsetText() 方法可以直接设置 int 类型的值么?
     答案, 不行. TextView 并没有给你做相应的转换, 如果你想调用的话, 直接使用相应的工具类进行转换吧.

Thursday 28th

     9. CheckBox 这个空间, 设置 paddingLeft 属性, 指的是复选框与文字之间的距离. 跟正常的控件不太一样.

~感谢捧场,您的支持将鼓励我继续创作~