Android 使用水平线布局管理器测量RecyclerView高度的解决方法 问题

Android 使用水平线布局管理器测量RecyclerView高度的解决方法 问题,android,android-recyclerview,linearlayoutmanager,Android,Android Recyclerview,Linearlayoutmanager,我想要一个带有width=match\u parent和height=wrap\u content的回收视图。我需要水平显示项目,以便使用适当的LinearLayoutManager 我面临着一个回收利用者的行为问题。我的列表中的项目有不同的内容(某些值存在,其他值在不同的项目中不存在),因此我的项目的高度可能会有所不同。 当我滚动列表时,其他项目的内容比第一个项目大,RecyclerView的高度不会调整以正确显示其子项,但会剪切其内容。 只有在第一个项目是最大的项目时,它才能工作。 研究 我

我想要一个带有width=match\u parentheight=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.xml


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中更改大小/布局。你能提供一些链接来获取更多信息吗?谢谢:)