murmurkerman 最近的时间轴更新
murmurkerman

murmurkerman

V2EX 第 691214 号会员,加入于 2024-05-16 11:39:38 +08:00
今日活跃度排名 9932
murmurkerman 最近回复了
2 天前
回复了 newOpenEyes 创建的主题 程序员 推荐算法知识或书籍
可以听一些博客,直播类的什么的当背景
只防君子不防小人哈哈哈。市面上一大把破解软件,什么 adobe ,office 都可以使用离线 license key 激活。只要定价不是太离谱,直接用账号系统、商店订阅比较合适。
写错了么,总监不应该月薪几十万
5 天前
回复了 rcj6056 创建的主题 Android android studio 新建项目编译报错
看下你的插件依赖加上么:
pluginManagement {
repositories {
google()
mavenCentral()
gradlePluginPortal()
maven("https://jitpack.io")
}
}
然后就是检查网络,是不是下载失败了
应该是 bug 吧,我也遇到之后就没有了。你可以长按消息看是哪个模型发的
"AI 可以替代很多前端编码工作" 来压工资,他们怎么还招人,直接用 Devin 不行吗,那不比人便宜多了。
@lixyz item 有没有加 id 和 type
好久没写 android view 哈哈哈,我写出来了,花掉了所有的摸鱼时间,https://github.com/Murmurl912/android_recycler_view_chat.git
总结下:
1. 去掉 RecyclerView 的 ItemAnimator
2. 在更新 Item 的时候,判断是否在底部,已经是底部的时候滚动到底部。
3. 我之前的方案是会加一个 FirstItem 和 LastItem 的占位 Item 到 RecyclerView 中,方便实现滚动到底部和顶部。
Core Code:
```kotlin

class MainActivity : ComponentActivity() {
private val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }
private val adapter by lazy {
ItemAdapter()
}
private var id = 1L
private val items = LinkedHashMap<Long, Item>()
private var job: Job? = null
private val layoutManager by lazy {
binding.recyclerView.layoutManager as LinearLayoutManager
}

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContentView(binding.root)
binding.root.fitsSystemWindows = true
binding.recyclerView.adapter = adapter
binding.recyclerView.itemAnimator = null
binding.generate.setOnClickListener {
if (job?.isActive == true) {
return@setOnClickListener
}
var item = Item.MessageItem(id++, "")
items[item.id] = item
updateItems()
job = lifecycleScope.launch {
MessageApi.generate()
.collect { text ->
item = item.copy(text = item.text + text, isGenerating = true).also {
items[it.id] = it
updateItems()
}
// scroll to bottom here
val isAtBottom =
layoutManager.findLastCompletelyVisibleItemPosition() == adapter.itemCount - 1
if (isAtBottom) {
layoutManager.scrollToPosition(adapter.itemCount - 1)
}
}
item = item.copy(isGenerating = false).also {
items[it.id] = it
updateItems()
}
}
}
}


private fun updateItems() {
adapter.updateItems(items.values.toMutableList()
.apply {
add(0, Item.FirstItem)
add(Item.LastItem)
}
)
}


}
```
用正序的 recycler view 比较合适。消息高度超过限制和不再自动滚动到底部。逆序的话要计算 scroll range 的变化,然后滚动变化的部分。
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2811 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 13ms · UTC 14:44 · PVG 22:44 · LAX 06:44 · JFK 09:44
Developed with CodeLauncher
♥ Do have faith in what you're doing.