请教一下, Android 里的 ListView 如何实时更新数据并逐条显示?

2020-11-30 12:58:36 +08:00
 ww050312
想做类似微信对话那种形式的 listview,但是是后台接受到十几个数据后依次添加到 arraylist 里,每次 arraylist.add(item)之后就调用 notifyDataSetChanged()方法想让视图上出现新的一行,3s 之后再添加第二行,可是用 for loop 之后发现就算我在每次 notifyDataSetChanged 之后延迟 3s 也会变成 3s 之后所有数据一次性出现在视图上……已经彻底懵了。请问一下有什么可行的方式实现吗?
1932 次点击
所在节点    问与答
32 条回复
Melodyer
2020-11-30 14:18:34 +08:00
@Melodyer Hadnler --> Handler
chniccs
2020-11-30 14:24:47 +08:00
ListView 已经不推荐使用了,推荐使用 RecycleView 可以局部刷新,另外你调用 notifyDataSetChanged 之后再延时 3 秒,这是在主线程中执行的吧?这样操作是阻塞了主线程了,所以你屏幕会卡住,延时操作需要在子线程中执行。然后到主线程中执行数据刷新。
aerzha
2020-11-30 14:30:31 +08:00
维护一个消息队列(因为可能本次没发完下次的又来了),使用 handler postMessageDelay 定时发送一条消息,handleMessage 中从消息队列里取出一条(注意同步问题),然后插入到 listview 中,再 handler postMessageDelay 。。。。

另外,推荐使用 recyclerView,直接单条数据插入,不用重新 notifydatasetchanged
ww050312
2020-11-30 14:35:20 +08:00
@aerzha 枯了 我都不知道有这个东西 单纯 follow 我们 prof 教的东西= = 顺便问下我是自己重写的 adaptor,如果换 recycleView 的话 adaptor 变化大吗?
aerzha
2020-11-30 14:47:44 +08:00
@ww050312 额,recyclerView 的用法, 在 Android 里算是最基础的东西了,随便网上扒篇文章,几分钟就能撸个 demo 了,adapter 的话,要使用 RecyclerView.Adapter 了
zeropercenthappy
2020-11-30 15:01:38 +08:00
都搞错了重点了..楼主现在的问题不是 ListView 还是 RecyclerView 的问题,而是如何做到延时 3s 取数据而不阻塞主线程的问题。

楼上说的 Handler 是可行的,但是就为了这一点需求未免有点太麻烦,所以你就老老实实用我上面说的 CountDownTimer 来做就行了,把这个作业完成了之后再去研究别人说的这些东西吧
v2xiaowen
2020-11-30 15:11:10 +08:00
3 秒给 list 里 add 一个数据
ww050312
2020-11-30 15:13:01 +08:00
@zeropercenthappy 谢啦!已经成功了👌
stfu
2020-11-30 16:10:53 +08:00
@zeropercenthappy LZ 应该本身就了解 Handler 了,你拿个封装的新东西给他他更难受吧。。 而且用 Handler 比较能让新手感受到业务数据的走向。
PS LZ05 年?建议找一个 25 岁+的前辈问问较为正确的学习路径,初步判断这个年龄学 Android 和所在做的 demo,是一条错误的路径。
zeropercenthappy
2020-11-30 16:24:13 +08:00
@stfu CountDownTimer 本质也是用 Handler 实现的。
当然本着学习的角度来说你是对的,只是我看 LZ 一脸懵的样子,再看看楼上的兄弟都扯到天边了,为了避免楼主 30 分钟 Android 开发从入门到放弃,先把解决方案给了先 haha 。
PS:不管你是学校的作业还是自己的兴趣,欢迎入坑 Android 开发。
ww050312
2020-11-30 17:56:20 +08:00
@stfu 😅啊这就是我们学校的入门安卓课(
@zeropercenthappy 嗯 谢谢
chenjiajia9411
2020-12-01 09:33:47 +08:00
如果愿意学 Kotlin,这个需求很快就撸出来了;即使来不及(看起来只要完成课上任务就行了),花半小时看看[Paging]( https://developer.android.com/topic/libraries/architecture/paging)怎么用也能做出来了……

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/730558

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX