记录安卓开发碰到的问题

瀑布流实现第一行占两列

一个列表,显示两列,我会使用 GridLayoutManager 实现

GridLayoutManager layoutManager = new GridLayoutManager(mContext, 2);
layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
    @Override
    public int getSpanSize(int position) {
        // 第一行显示一个,之后显示两个
        if (position == 0) {
            return 2;
        }
        return 1;
    }
});
rv_data.setLayoutManager(layoutManager);

但是这个列表突然要显示成瀑布流了,所以要改成 StaggeredGridLayoutManager,但是 StaggeredGridLayoutManager 没有 setSpanSizeLookUp 方法,解决方法如下

Activity:

StaggeredGridLayoutManager layoutManager = new StaggeredGridLayoutManager(2, RecyclerView.VERTICAL);
rv_data.setLayoutManager(layoutManager);

Adapter:

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
    // 第一行占满
    StaggeredGridLayoutManager.LayoutParams layoutManager = (StaggeredGridLayoutManager.LayoutParams) holder.itemView.getLayoutParams();
    layoutManager.setFullSpan(position == 0);
}

计时不能用 Handler 和 Timer

之前做倒计时,1秒1跳,做法是用 Handler 每隔一秒发送一次。但是手机息屏后,过了差不多5分钟,就有5秒的误差。

网络上搜索解决方法,说改用 Timer,试了下发现也一样不准,息屏之后也会变慢。

自己想到方法,保存开始计时的时间戳,然后 Handler 里判断当前时间和开始时间的差值,这个准。

onBackPressed 方法在 Pixel 手机上不触发的问题

就觉得很奇怪,网上搜了下,说要用 onKeyDown 来实现

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        // TODO
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

换了其它的手机,发现都会走 onKeyDown,那看来以后要用这个方法来实现拦截返回的功能了,不然兼容性会有问题

富文本在部分手机上显示不正确的问题

就是一个TextView,其中一部分字体颜色不同,实现起来很简单

spannableString.setSpan(new ForegroundColorSpan(), , , );

但是在小米手机上,没有设置字体颜色的部分直接不显示了,找了下原因,是因为没有设置默认的字体颜色

android:textColor="#333333"

布局里添加个字体颜色就行了