成长之路二

164 阅读2分钟

思路很重要

需求一:

底部有个添加按钮,当软键盘弹出,标题栏不动,底部按钮也不能随着软件盘弹起。想到用windowSoftInputMode,但尝试它所有的参数都不能实现。要么添加按钮不弹起,但标题栏滚动;要么标题栏不动,添加按钮弹起。
有天灵机一动(对于大佬来说分分钟的事),监听软键盘弹起、隐藏,添加按钮也随之显示隐藏不就结了。哈哈,完美解决。

需求二:

搜索功能:简单来说就是进入一个页面后台把所有数据返回(数据不是很多,大概几十条吧),用户可以填入部分关键字搜索相应内容。
思路1:监听用户输入,无脑调用接口。
思路2:存入数据库,根据用户输入关键字,数据库模糊查询。
思路3:数据存入集合,直接内存中查询。
目前采用的是思路2,感觉思路3更好,下次优化的时候改为思路3。

功能

如图

Alt
选择当日售卖,下面选择隐藏;选择跨日预定,下面选择日期弹起。

 int height = rvWeek.getMeasuredHeight();
 rvCommodity.smoothScrollBy(0, height);

用了上面的代码,没有什么反应!心想不应该啊。断点调试时,发现了很奇怪的现象,上面代码竟然生效了!!!上网搜索解决原因的时候,无意中看到view.post()方法,瞬间明白debug调试为何执行了。
那么为什么呢?首先,调用view的隐藏和显示时,recyclerview会重新测量子view,测量完成的时候,调用上面代码才能有效果,而view.post()就是等view测量完成才执行。不信,看下view.post()部分源码简单分析下

    final AttachInfo attachInfo = mAttachInfo;
        if (attachInfo != null) {
            return attachInfo.mHandler.post(action);
        }

        // Postpone the runnable until we know on which thread it needs to run.
        // Assume that the runnable will be successfully placed after attach.
        getRunQueue().post(action);

看到handler,runQueue应该大致能猜到原因了。执行时间点,要写的话肯定要长篇大论,这些我就不写了(哈哈,说的我能写出来似的),网上大神分析文章一大堆。确定的是,队列执行的时候,measure已经完成,要不然getMeasuredHeight()获取不到值的。

ps: 如果对你有所帮助,那是我的荣幸;如果对你没帮助,说明你的技术在我之上。那么,废话不多说了,在此我厚着脸皮推荐下自己的公众号,大佬们可别误会啊,我的公众号Android技术是次要的,看上面也知道我是个菜鸟,能分享啥牛逼的技术嘛!公众号我主要分享的是我对股市(投资)、楼市、生活的感悟等,希望会对你有所帮助。

Alt