求大神帮我解决一下软键盘弹出的一点解决思路

泡在网上的蜘蛛 2015-12-07 06:23:07
我的首页有一个与QQ聊天差不多的界面,EditText弹出时软键盘会把聊天记录顶上去
我的activity设置的是android:windowSoftInputMode="stateHidden|adjustResize"


遇到的问题就是:
当聊天内容越来越多时,软键盘弹出就会有点卡,我测试了调用了onMeasure,onLayout重绘了,就会有点卡顿,如何才能做到像QQ一样那么多记录,软键盘弹出来都不会卡啊?
求指点
...全文
230 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
KE南 2015-12-09
  • 打赏
  • 举报
回复
引用 4 楼 bobxie520 的回复:
[quote=引用 3 楼 u010382037 的回复:] 卡顿的话 ,估计是你的聊天记录那个列表写的有问题。 估计你是重写listview 实现聊天记录的吧。 看看adapter 的getview 方法怎么写的。贴一下代码
代码太多了,里面有20种的viewType 我使用一个ViewHolder来保存视图的view缓存,判断convertView==null创建 否则从tag里面取ViewHolder对象来进行加载。 我测试出来就是软件盘弹出时,重新计算了listview的measure方法与onlayout方法,当列表数据过多时弹出软键盘就会卡一下把会把页面顶上去。 我这里的listview是linearlayout自定义出来的。不知道是不是由于我使用了scrollview包裹了linearlayout的问题,求大神指点一下思路。 [/quote] 如果你是在onMeasure方法计算每个item的高度,是很耗时的。每个item需要几十毫秒,item一多就会卡顿的。 如果你还是要按照计算高度的方式来做的话,你不必计算每个item的高度。可以预先用几个固定的值来代替。 比如,聊天文字是一行 高度是固定的,两行的高度也是固定的。需要计算的时候直接赋值就可以,而不是让他去计算。 这样可以节省一定时间。但是你的viewholder种类多的话 这样就不好搞了。因为高度会随时变化的。 另一种解决方法 用RecyclerView 代替你用linearLayout实现的聊天记录列表。 通过layoutManager 可以很简洁的实现不同的viewholder。 做做试试看吧
  • 打赏
  • 举报
回复
引用 5楼KE南 的回复:
[quote=引用 4 楼 bobxie520 的回复:] [quote=引用 3 楼 u010382037 的回复:] 卡顿的话 ,估计是你的聊天记录那个列表写的有问题。 估计你是重写listview 实现聊天记录的吧。 看看adapter 的getview 方法怎么写的。贴一下代码
代码太多了,里面有20种的viewType 我使用一个ViewHolder来保存视图的view缓存,判断convertView==null创建 否则从tag里面取ViewHolder对象来进行加载。 我测试出来就是软件盘弹出时,重新计算了listview的measure方法与onlayout方法,当列表数据过多时弹出软键盘就会卡一下把会把页面顶上去。 我这里的listview是linearlayout自定义出来的。不知道是不是由于我使用了scrollview包裹了linearlayout的问题,求大神指点一下思路。 [/quote] 如果你是在onMeasure方法计算每个item的高度,是很耗时的。每个item需要几十毫秒,item一多就会卡顿的。 如果你还是要按照计算高度的方式来做的话,你不必计算每个item的高度。可以预先用几个固定的值来代替。 比如,聊天文字是一行 高度是固定的,两行的高度也是固定的。需要计算的时候直接赋值就可以,而不是让他去计算。 这样可以节省一定时间。但是你的viewholder种类多的话 这样就不好搞了。因为高度会随时变化的。 另一种解决方法 用RecyclerView 代替你用linearLayout实现的聊天记录列表。 通过layoutManager 可以很简洁的实现不同的viewholder。 做做试试看吧 [/quote]好的,谢谢给的思路,等我优化时我就来试试,现在主要的就是键盘弹出来就会自动走那个计算大小的方法,我研究一下看是否可以自定义。
  • 打赏
  • 举报
回复
引用 3 楼 u010382037 的回复:
卡顿的话 ,估计是你的聊天记录那个列表写的有问题。 估计你是重写listview 实现聊天记录的吧。 看看adapter 的getview 方法怎么写的。贴一下代码
代码太多了,里面有20种的viewType 我使用一个ViewHolder来保存视图的view缓存,判断convertView==null创建 否则从tag里面取ViewHolder对象来进行加载。 我测试出来就是软件盘弹出时,重新计算了listview的measure方法与onlayout方法,当列表数据过多时弹出软键盘就会卡一下把会把页面顶上去。 我这里的listview是linearlayout自定义出来的。不知道是不是由于我使用了scrollview包裹了linearlayout的问题,求大神指点一下思路。
KE南 2015-12-08
  • 打赏
  • 举报
回复
卡顿的话 ,估计是你的聊天记录那个列表写的有问题。 估计你是重写listview 实现聊天记录的吧。 看看adapter 的getview 方法怎么写的。贴一下代码
  • 打赏
  • 举报
回复
引用 1 楼 heaimnmn 的回复:
分层级做咯,弹出fragment
什么意思?把那个历史列表做成一个fragment还是?能给具体一点吗?
哎,真难 2015-12-07
  • 打赏
  • 举报
回复
分层级做咯,弹出fragment

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧