直播聊天室遇到的坑
先上图:
Paste_Image.png
如上图所示,上面是视频展示,下面是三个模块,来回可以切换。
一开始坑就来了,因为我主做聊天模块,就把下面的输入框放在 Fragment 里面了。本人的手机是红米2增强版是带有实体返回键的,做的差不多了,在我的手机上测试没问题。但是到了提测时候,公司还有一部魅族的虚拟返回按键手机,在上面展示的时候输入框就被遮住了显示不出来。如下图所示:
打开斗鱼的 APP 参考一下看人家是怎么做的,发现斗鱼装在这个手机上的时候,输入框是盖在如下图红框位置上的。
Paste_Image.png
原先放的是 Fragment 里面最高也不会超过如图中的红框部分,很显然这个输入框是放在外面的 Activity 中的。
以后遇到这样的情况切记:一定把输入框放到activity 里面,不要放在 Fragment 中
输入框布局如下:
Paste_Image.png从左往右依次是 TextView Imageview Imageview,
在移动输入框到 Activity 的过程中发现,TextView 获取不到,而另外两个 ImageView 的点击事件没问题。
项目重新 rebuild 也无计于事,折腾了好久,最后在老大的建议下
修改 TextView 布局中的 XML的 id,重新设置没问题了。
** 应该是项目中的 id 有重复的,导致了获取出问题,以后遇到这种问题可以照此法尝试解决**
聊天的时候有如下要求,当聊天到底的时候试试刷新聊天列表,如果手动上推聊天信息列表展示以前发来的消息,这时候如果有新消息到来就会展示如下图红框内容,点击红框,列表滑到最底端,红框消失,当手拉消息列表到最底部是红框也消失。
Paste_Image.png
一开始我的做法就是设置 listView 的滑动监听,判断是否在最底端,在最底端时来消息的时候就调用 adapter 的notifyDataSetChanged()方法。不在底端时,就只是添加消息到数据源,直到点击或者再次上拉到底的时候一次性调用notifyDataSetChanged()方法来执行。
但是这种方式总是报崩溃,出现如下 bug:
The content of the adapter has changed but ListView did not receive a
notification. Make sure the content of your adapter is not modified
from a background thread, but only from the UI thread. Make sure
your adapter calls notifyDataSetChanged() when its content changes.
上网查询,基本上大意就是 adapter 的数据与现在内存实际数据不匹配,出现了这个问题,很是纠结啊。折腾了许久,咨询了老大,说listView 有个属性可以控制是否是实时刷新还是不刷新,遂查找之,发现如下属性:
android:transcriptMode="alwaysScroll"
就是此来控制聊天列表的实时刷新还是暂停不动。因为这是基于业务来灵活控制的,需要在代码中灵活处理而不是直接在XML 布局文件中写死,代码如下:
//界面实时滚动
chatListView.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
//界面保持不动
chatListView.setTranscriptMode(ListView.TRANSCRIPT_MODE_NORMAL);
剩下的就是自己在代码中灵活运用了
前车之鉴,以后大家在项目中遇到类似问题也能节省点时间吧