Android 使用水平线布局管理器测量RecyclerView高度的解决方法 问题
我想要一个带有width=match\u parent和height=wrap\u content的回收视图。我需要水平显示项目,以便使用适当的LinearLayoutManager 我面临着一个回收利用者的行为问题。我的列表中的项目有不同的内容(某些值存在,其他值在不同的项目中不存在),因此我的项目的高度可能会有所不同。 当我滚动列表时,其他项目的内容比第一个项目大,RecyclerView的高度不会调整以正确显示其子项,但会剪切其内容。 只有在第一个项目是最大的项目时,它才能工作。 研究 我看到了2016年的一些老问题,当时人们也有类似的问题。大多数解决方案建议将recyclerView版本更新为'com.android.support:recyclerView-v7:23.2.1'。 但是现在我们使用Androidx。recyclerView当前的稳定版本是1.0.0,我尝试了1.1.0-rc1,但得到了相同的结果 此外,我还尝试为我的LinearLayoutManager设置AutomeasureEnabled(true),但效果并不理想 我的变通方法 因此,最后我尝试更新ViewHolder视图,不是直接通过给TextView赋值,而是通过view.post(Runnable{})来更新。我不知道到底是什么原因 第二张GIF上显示了预期的行为:只要我们滚动到内容更大的项目,视图大小就会更新,recyclerView高度也会更新 我的问题 你认为上面的解决方法可以吗?也许你有一些更聪明的想法/方法? 谢谢你的帮助和关注 main_activity.xmlAndroid 使用水平线布局管理器测量RecyclerView高度的解决方法 问题,android,android-recyclerview,linearlayoutmanager,Android,Android Recyclerview,Linearlayoutmanager,我想要一个带有width=match\u parent和height=wrap\u content的回收视图。我需要水平显示项目,以便使用适当的LinearLayoutManager 我面临着一个回收利用者的行为问题。我的列表中的项目有不同的内容(某些值存在,其他值在不同的项目中不存在),因此我的项目的高度可能会有所不同。 当我滚动列表时,其他项目的内容比第一个项目大,RecyclerView的高度不会调整以正确显示其子项,但会剪切其内容。 只有在第一个项目是最大的项目时,它才能工作。 研究 我
list_item.xml
main活动
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.main_activity)
recyclerView.layoutManager =
LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)
recyclerView.adapter = Adapter(100) // 100 is the number of items to be displayed, adapter generates them
}
}
适配器代码段(默认,未按预期工作):
override fun onBindViewHolder(holder: ViewHolder, pos: Int) {
holder.itemView.itemTextView1.text = "String \n" + pos.toString()
holder.itemView.itemTextView2.text = "String \n" + pos.toString()
holder.itemView.itemTextView3.text = "String \n" + pos.toString()
holder.itemView.itemTextView2.visibility = if (pos > 10) View.VISIBLE else View.GONE
holder.itemView.itemTextView3.visibility = if (pos > 30) View.VISIBLE else View.GONE
}
override fun onBindViewHolder(holder: ViewHolder, pos: Int) {
holder.itemView.post {
holder.itemView.itemTextView1.text = "String \n" + pos.toString()
holder.itemView.itemTextView2.text = "String \n" + pos.toString()
holder.itemView.itemTextView3.text = "String \n" + pos.toString()
holder.itemView.itemTextView2.visibility = if (pos > 10) View.VISIBLE else View.GONE
holder.itemView.itemTextView3.visibility = if (pos > 30) View.VISIBLE else View.GONE
}
}
适配器片段(使RecyclerView按预期工作):
override fun onBindViewHolder(holder: ViewHolder, pos: Int) {
holder.itemView.itemTextView1.text = "String \n" + pos.toString()
holder.itemView.itemTextView2.text = "String \n" + pos.toString()
holder.itemView.itemTextView3.text = "String \n" + pos.toString()
holder.itemView.itemTextView2.visibility = if (pos > 10) View.VISIBLE else View.GONE
holder.itemView.itemTextView3.visibility = if (pos > 30) View.VISIBLE else View.GONE
}
override fun onBindViewHolder(holder: ViewHolder, pos: Int) {
holder.itemView.post {
holder.itemView.itemTextView1.text = "String \n" + pos.toString()
holder.itemView.itemTextView2.text = "String \n" + pos.toString()
holder.itemView.itemTextView3.text = "String \n" + pos.toString()
holder.itemView.itemTextView2.visibility = if (pos > 10) View.VISIBLE else View.GONE
holder.itemView.itemTextView3.visibility = if (pos > 30) View.VISIBLE else View.GONE
}
}
通常,您应该避免在
onBindViewHolder
内更改ViewHolder
的大小/布局。我建议创建3种不同的项目类型,并将可见性调用移动到onCreateViewHolder
@Pawel有趣的想法中,我会尝试一下。我对这种方法的一个担忧是,所描述的视图只是一个示例,在我的实际任务中,我有一个更复杂的视图,具有不同的标签,这些标签可以是可见的或消失的,因此它们会影响视图高度。因此,这种方法假设我需要一大组不同的视图类型(对于我的字段的每个可能组合)。无论如何,我以前没有听说过避免在onBindViewHolder中更改大小/布局。你能提供一些链接来获取更多信息吗?谢谢:)一般情况下,您应该避免更改onBindViewHolder中ViewHolder的大小/布局。我建议创建3种不同的项目类型,并将可见性调用移动到onCreateViewHolder
@Pawel有趣的想法中,我会尝试一下。我对这种方法的一个担忧是,所描述的视图只是一个示例,在我的实际任务中,我有一个更复杂的视图,具有不同的标签,这些标签可以是可见的或消失的,因此它们会影响视图高度。因此,这种方法假设我需要一大组不同的视图类型(对于我的字段的每个可能组合)。无论如何,我以前没有听说过避免在onBindViewHolder中更改大小/布局。你能提供一些链接来获取更多信息吗?谢谢:)