博文

一点经验教训:RecyclerView的Adapter中getItemCount()不起作用的原因

 很久没写过项目了。最近重新拣回以前的老本行Android开发,写了个小项目。 今天,我在写项目的过程中,用到RecyclerView时,发现其Adapter中重写的getItemCount()方法不起作用。Adapter中使用了两种item view:一个是列表的标题item view,用来显示list数据源有多少个数据,另一个是list列表中的详细数据。如果List中存在数据时,该列表至少会有两项视图。 在调试的过程中,数据源中的数据更新到了6个。本来列表中应该显示7项的(1项标题+6项数据),结果只显示了2项(1项标题+1项数据)。因此,仔细检查了Adapter有没有写错,还有RecyclerView有没有初始化错误。一一排除后,发现错误依然在。 因此,我打开了调试工具,打断点一步步调试。 一开始追踪到RecyclerView.Recycler.tryGetViewHolderForPositionByDeadline()中时,其传进来的参数一直只有position=0和position=1两项,并没有position=2-6。正常的话,position是会依次传进2-6四个值的。判断是上一个调用并没有把position剩余的值传进来,于是,通过调用栈往上追踪。 通过追踪发现,tryGetViewHolderForPositionByDeadline()这个方法是被LayoutManager的LayoutState.next()方法调用的,此方法用来获取下一个布局的View。继续往上追踪,经过一个layoutChunk()方法,最终定位到了LayoutManager.fill()方法中。 在fill()方法里面,有一个while循环用来判断是否还有其他元素。判断条件是(layoutState.mInfinite || remainingSpace > 0) && layoutState.hasMore(state)。经判断,后者layoutState.hasMore(state)是满足的,因此,很有可能就是前者(layoutState.mInfinite || remainingSpace > 0)这个条件没符合要求,才导致没办法渲染其他列表元素。 其remainingSpace的定义是 int remainingSpace...

Install gr-sdrplay on macOS

I attempted to install gr-sdrplay on MacOS. Here are some magic tricks to build and install. 1. Install GNURadio. 2. Follow the steps in SDRPlay official document to install dependencies via MacPort or Homebrew. 3. Fetch the source code in HB9FXQ's GitLab . 4. Modify CMakeLists.txt, include PMT in the link. Change set(GR_REQUIRED_COMPONENTS RUNTIME) to set(GR_REQUIRED_COMPONENTS RUNTIME PMT) 5. cmake, make and install. Enjoy it. Reference: 1. https://lists.gnu.org/archive/html/discuss-gnuradio/2014-04/msg00019.html

云栖小镇 参会感想 Day-1

最近过得有点无所事事,正好看到杭州开云栖大会了,挺想来的,便买了票,奔赴千里赶到杭州,参加一年一度的阿里巴巴云栖大会。 今天参会第一天,因为人生地不熟,并且被高德地图的公交换乘功能坑了一次,花了整整两个小时才赶到会场。下面开始切入正题…… 今天看了好几个分会场的演讲。给我印象最深的莫过于年轻人敢想,敢做的精神。听了新零售数据专场的几场演讲,演讲者说,年轻一代的互联网人,他们都非常有思想,头脑都转得很快。这一点是跟三四十岁的中年人的思维没办法比的。中年人的思维容易僵化,很多事情都不敢想。想做某些事情的时候,年轻人敢想就敢马上付诸行动。 他举了一个例子。几年前,他跟几十个老板聊新零售,绝大多数的老板都对这些事情不以为然,认为必然失败。只有一个从外国留学回来的年轻人,他觉得这个事情可以尝试做,因此他坚持了。现在,新零售遍地开花,新零售2.0已经出现,想再从0开始进入新零售1.0的圈子,显得有点晚了。 他举的这个例子,我感触很深。反思自己,首要的,我觉得我不缺机灵古怪的想法,缺的是对事物的思考和探索。觉得自己还是太浮躁,很多东西都没有静下心来自己好好想明白,为什么会这样。最主要是,当我知道这样之后,它可以为我们带来什么?有什么其他应用?自己有没有更好的想法去改进?确实需要这样的探索,才能深入挖掘事物的本质。 其次,例子中,抓住机遇的年轻人他的见识非常广。这也是我非常缺乏的。虽然自己上大学了,但是觉得自己虽然研究的东西越来越深,自己的知识面也越来越窄了。并且经常只专注技术上的某一点,而不结合其他方面做全局分析,我觉得这样下去是很危险的。这或许跟我的圈子太窄也有关系。圈子太窄,很少跟别人接触,自己就愈发容易自傲。来了云栖大会才知道自己知道的只是知识的冰山一角,还有很多领域自己是完全不懂的,比如说金融,零售,销售方面,他们都是怎么运作的?是如何与技术有机结合的?还是需要谦卑,不能把总自己关在自己的世界里。多出来走走,多读书,并且多接触社会,这样才能看得更广。 今天主要泡在数据智能实践专场会场里了。有个演讲题为“直播个性化推荐系统中的AI技术实践”。主要讲的是映客直播如何通过深度学习及文本挖掘技术,对直播内容进行快速准确地识别,进而更精确地将直播内容推荐给用户。他们主要用到的是将半结构化数据(如图像,语音,文本等)进行深度学习,找出其特征编码。再将...

macOS安装配置libnfc小记

今天尝试在自己的Macbook Pro上安装了libnfc。 我使用的是NXP PN532芯片,通过UART的形式,使用CH340G的uart转usb芯片接入Macbook Pro。系统是macOS High Sierra 10.13 安装步骤参考 libnfc的官方文档 ,总结如下: 1. 从github上clone libnfc的源码 2. 使用autoreconf -vis命令 3.  ./configure --with-drivers=pn532_uart --sysconfdir=/etc 4. make 5. make install 安装部分结束。接下来是配置部分。 我通过UART的方式连接PN532。使用CH340G芯片完成USB到UART串口的转换。macOS系统下,CH340G芯片可以从WCH的官网 这里 下载到。安装完成并重启后,在终端中查看/dev的设备,会发现多出来一个叫tty.wchusbserial1420的设备。记住它。 上述安装过程的第三步,指定了配置文件目录在/etc下。因此,新建/etc/nfc文件夹,并且新建libnfc.conf文件。添加内容如下: device.name = "NXP PN532" device.connstring = "pn532_uart:/dev/tty.wchusbserial1420" 然后保存。 接下来,将卡放在PN532读卡器上,并在终端运行nfc-list。 如果看到 NFC device: NXP PN532 opened 这行字的话,说明已经安装成功了。 更新:在编译依赖libnfc库的软件时,可能会出现找不到libnfc库的问题。 解决方法:参考了Stack Overflow上的 这篇文章 ,在编译mfoc、mfcuk等软件,configure时,加入如下代码: ./configure LDFLAGS=-L/usr/local/lib PKG_CONFIG_PATH=/usr/local/lib/pkgconfig

省实附中 课间铃声

旧铃声( 2005 年建校 - 2009? 年) 上课铃:「口哨与小狗」(第一节课为完整版,其他课为短版) 第一节课( 8:40 )下课铃:未知 第二节课( 9:20 )下课铃:未知 课间操:「团结友谊进行曲」 第四节课( 12:00 )下课铃:「 Espana 」 - Paul Mauriat 午睡铃声:未知 午休起床铃声:「 Blue Sky 」 - Mantovani & his Orchestra 第五节课上课铃:未知 第五节课下课铃:未知 第六节课下课铃:未知 下午 5:30 铃声:未知 下午 6:40 晚读预备铃:「卡农」 晚上 9:50 睡觉铃:「 Ave Maria 」 - The Mantovani Orchestra 新铃声( 2009 年 ? 启用) 起床铃声:蓝色多瑙河 上课铃:「天上的星星下凡来」 课间操:「天上的星星下凡来」 - 胎教音乐 & 「 Слава Родине 」 - Парадный Марш 下课铃:未知 下午 5:50 放学铃声:「 Espana 」 - Paul Mauriat 下午 6:40 晚读预备铃:「 Blue Sky 」 - Mantovani & his Orchestra 晚上 9:50 睡觉铃:「 Ave Maria 」 - The Mantovani Orchestra

RecyclerView设计思想初体验

昨天看了Google I/O 16中关于RecyclerView的视频「RecyclerView Ins and Outs」,里面谈到了RecyclerView的一些设计思想。简单地说一下感受。 RecyclerView的设计初衷是为了更好地自定义列表显示。在RecyclerView的实际使用中,整体感受是职责做了更好的分离,使用起来自定义程度更高。 ListView与RecyclerView的对比 1、ListView列表显示提供的很多功能,本身可能并不需要。如Header、Divider等。RecyclerView中,把这些可选的功能划分到下属的组件中,用户可选进行实现,更灵活。 如item的点击事件 ListView的点击事件监听是对整个item进行点击监听。监听事件的设置是在ListView中通过setOnItemClick()进行设置的。 而现实情况中,每个item的需要点击的视图可能不单单只有整体的item,item的其他元素,如点赞按钮等,都需要实现局部点击。因此,ListView不能满足需求。 RecyclerView中,默认不提供点击事件的监听。如果开发者需要对RecyclerView中的item需要点击的View进行监听,需要在Adapter或者ViewHolder中自行监听相应View的点击事件。这样设置点击事件更灵活,自由度更高。 再如分割线的实现 ListView中,分割线可通过ListView.addHeader() / addFooter()方法添加分割线。但是这种方法的局限是只能传入View对象。 而在RecyclerView中,分割线等功能可以通过RecyclerView.ItemDecoration类实现。对视图的定制更灵活,可实现StickyHeader(分类悬浮Header)等酷炫功能。 2、职责分离,功能解耦 如RecyclerView与LayoutManager的职责分离。 在ListView时代,只能实现垂直列表。而若需要使用其他形式显示,只能替换其他View来实现。而在RecyclerView中,显示形式(垂直显示、网格显示)通过LayoutManager控制,与RecyclerView解耦。RecyclerView只需要通过setLayoutManager()方法,传入不同的Layou...

Python追加文件内容

Python中操作文件的open()方法,mode有下列几种属性: w 写入 r  读取 a  追加 因此,如果要往文件中追加内容,mode应该使用a