直播聊天室遇到的坑

作者: 被风扬起的沙 | 来源:发表于2017-03-06 15:15 被阅读171次

    先上图:


    Paste_Image.png

    如上图所示,上面是视频展示,下面是三个模块,来回可以切换。
    一开始坑就来了,因为我主做聊天模块,就把下面的输入框放在 Fragment 里面了。本人的手机是红米2增强版是带有实体返回键的,做的差不多了,在我的手机上测试没问题。但是到了提测时候,公司还有一部魅族的虚拟返回按键手机,在上面展示的时候输入框就被遮住了显示不出来。如下图所示:

    Paste_Image.png

    打开斗鱼的 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);
    

    剩下的就是自己在代码中灵活运用了

    前车之鉴,以后大家在项目中遇到类似问题也能节省点时间吧

    相关文章

      网友评论

        本文标题:直播聊天室遇到的坑

        本文链接:https://www.haomeiwen.com/subject/qfkugttx.html