如何让视图绑定与 RecyclerView.ViewHolder 中的 XML 布局高度一起使用,就像他们对 Kotlin Synthetics 所做的那样?

     2023-04-18     288

关键词:

【中文标题】如何让视图绑定与 RecyclerView.ViewHolder 中的 XML 布局高度一起使用,就像他们对 Kotlin Synthetics 所做的那样?【英文标题】:How to get view binding to work with XML layout heights in RecyclerView.ViewHolder like they did with Kotlin Synthetics? 【发布时间】:2021-12-29 18:49:46 【问题描述】:

在尝试将应用程序从已失效的 Kotlin 合成转换为更新的/受支持的视图绑定方法时,我遇到了这个问题,其中布局被夸大,但 layout_height 在夸大的布局中被忽略。结果是一个看起来不太好的皱缩视图。

    inner class InfoAdapter(val data: Array<String>) : androidx.recyclerview.widget.RecyclerView.Adapter<androidx.recyclerview.widget.RecyclerView.ViewHolder>() 
        private val header = 0
        private val item = 1
        private var clickListener: RecyclerClickListener? = null

        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): androidx.recyclerview.widget.RecyclerView.ViewHolder 
            when (viewType) 
                item -> return ItemVH(StringRowBinding.inflate(layoutInflater))
                header -> return HeaderVH(InfoHeaderBinding.inflate(layoutInflater))
            

            return ItemVH(StringRowBinding.inflate(layoutInflater))
        

...

        inner class ItemVH(private val binding: StringRowBinding): androidx.recyclerview.widget.RecyclerView.ViewHolder(binding.root) 
            init 
                itemView.setOnClickListener  v ->
                    clickListener?.itemClicked(v, adapterPosition)
                
            
            fun bind(text: String) 
                binding.title.text = text
            
        

...
    

string_row.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:background="?android:attr/selectableItemBackground">

    <TextView
        android:id="@+id/title"
        android:layout_
        android:layout_
        android:layout_centerVertical="true"
        android:layout_gravity="center_vertical"
        android:layout_marginLeft="16dp"
        android:layout_marginStart="16dp"
        android:layout_marginRight="16dp"
        android:layout_marginEnd="16dp"
        android:textAppearance="@style/TextAppearance.AppCompat.Body2"/>

</RelativeLayout>

相对布局的高度应该是 48dp,但似乎该属性被忽略了。数据确实显示,并且布局高度属性在 Kotlin 合成中工作得很好。

我找到了this SO question related to Activity + view binding,但没有针对 ViewHolder + 视图绑定的特定内容。与该问题的公认答案相关的是反问:如果它只是要忽略边距、高度和膨胀布局的宽度和“修复”基本上是根本不使用inflater() 调用而只使用findViewById()?也就是说,被接受的答案大多违背了使用视图绑定器膨胀视图的目的,并重新引入了findViewById()。无论如何,如何使特定答案适应这种情况并不明显。

【问题讨论】:

【参考方案1】:

问题是您使用了inflate() 的重载,它没有指定父视图。执行此操作时,根视图上的任何 layout_ 属性都将被忽略(并替换为默认值)。试试这个:

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): androidx.recyclerview.widget.RecyclerView.ViewHolder 
    when (viewType) 
        item -> return ItemVH(StringRowBinding.inflate(layoutInflater, parent, false))
        header -> return HeaderVH(InfoHeaderBinding.inflate(layoutInflater, parent, false))
    

    return ItemVH(StringRowBinding.inflate(layoutInflater, parent, false))

确保将false 作为第三个参数传递; RecyclerView 本身将管理将子视图附加到父视图。

【讨论】:

如何将视图绑定与线性布局一起使用?

】如何将视图绑定与线性布局一起使用?【英文标题】:HowtouseViewBindingwithLinearLayout?【发布时间】:2020-09-0702:36:43【问题描述】:我有一个像这样的activity_main.xml文件。<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="http:/... 查看详情

如何绑定列表视图

】如何绑定列表视图【英文标题】:Howdoyoubindalistview【发布时间】:2021-01-2020:41:33【问题描述】:我有一个CoordinateList视图,它显示了已输入的CoordinateRow视图的列表,并且可以就地编辑(在列表视图中)。要将新点添加到列表中... 查看详情

当堆栈视图调整大小时,如何让 NSButton 与 NSStackView 分离?

】当堆栈视图调整大小时,如何让NSButton与NSStackView分离?【英文标题】:HowcanyougetanNSButtontodetachfromanNSStackViewwhenthestackviewresizes?【发布时间】:2014-01-1317:40:43【问题描述】:当堆栈视图调整大小时,如何让NSButton与NSStackView分离... 查看详情

如何使用 RxSwift 和 RxSwiftDataSources 将表视图与表示不同数据类型的多个部分绑定?

】如何使用RxSwift和RxSwiftDataSources将表视图与表示不同数据类型的多个部分绑定?【英文标题】:HowtobindtableviewwithmultiplesectionsthatrepresentdifferentdatatypesusingRxSwiftandRxSwiftDataSources?【发布时间】:2016-11-0623:41:08【问题描述】:我正在... 查看详情

如何让我的 WPF 用户控件的依赖属性更新我的视图模型?

】如何让我的WPF用户控件的依赖属性更新我的视图模型?【英文标题】:HowdoImakemyWPFUserControl\'sdependencypropertiesupdatemyviewmodel?【发布时间】:2011-04-2215:04:36【问题描述】:我正在尝试创建一个具有要绑定的依赖属性的用户控件。... 查看详情

如何将 MVC 模型与 ajax 调用绑定?

】如何将MVC模型与ajax调用绑定?【英文标题】:howtobindaMVCmodelwithajaxcall?【发布时间】:2020-04-1822:50:51【问题描述】:我想将MVC模型与ajax调用绑定,并希望在局部视图中使用onclick事件调用JS函数,但没有定义错误bulkconfirm()以及... 查看详情

在 Android 中解除绑定后,如何让服务与听众保持活力?

】在Android中解除绑定后,如何让服务与听众保持活力?【英文标题】:HowtokeepaServicewithlistenersaliveafterunbindinAndroid?【发布时间】:2014-05-1817:15:55【问题描述】:我目前正在使用XMPP构建一个聊天应用程序。我创建了一个服务来处... 查看详情

swiftui如何让绑定到同一个状态的多个textfield呈现出不同输入行为

...对状态的改变都“毫无反应”。那么,这在SwiftUI中这是如何做到的呢?想知道吗?答案超乎寻常的简单!Let‘sGO!功能分析1.多个视图绑定到同一个状态的默认表现我们假设一下&#x 查看详情

如何让 Knockout JS 在按键上进行数据绑定而不是失去焦点?

】如何让KnockoutJS在按键上进行数据绑定而不是失去焦点?【英文标题】:HowcanIgetKnockoutJStodata-bindonkeypressinsteadoflost-focus?【发布时间】:2011-05-2203:23:14【问题描述】:knockoutjs的这个示例有效,因此当您编辑字段并按TAB时,视图模... 查看详情

如何将 MVVMCross 与 C# 的标记绑定

】如何将MVVMCross与C#的标记绑定【英文标题】:HowtobindMVVMCrosswithMarkupforC#【发布时间】:2021-07-0605:52:21【问题描述】:我正在尝试使用Xamarin社区工具包中的C#markupextensions创建Xamarin.Forms视图,但想使用MvvmCross绑定视图。我有一个Mv... 查看详情

在 IB 中,当我调整父视图的大小时,如何让子视图保持与父视图相同的大小?

】在IB中,当我调整父视图的大小时,如何让子视图保持与父视图相同的大小?【英文标题】:inIBhowdoIgetasubviewtostayatthesamesizeasit\'sparentwhenIresizetheparent?【发布时间】:2011-06-3004:18:05【问题描述】:在InterfaceBuilder中,我有一个父... 查看详情

核心数据、绑定、NSArrayController 和表视图 - 如何生成核心数据上下文的视图

】核心数据、绑定、NSArrayController和表视图-如何生成核心数据上下文的视图【英文标题】:Coredata,bindings,NSArrayControllerandtableviews-howtogenerateaviewofacoredatacontext【发布时间】:2012-03-2313:09:12【问题描述】:我有一个工作系统,可以... 查看详情

SwiftUI:如何让列表视图中的图像与列表项的操作不同?

】SwiftUI:如何让列表视图中的图像与列表项的操作不同?【英文标题】:SwiftUI:howtohaveimageinlistviewnothavesameactionaslistitem?【发布时间】:2021-05-3114:14:06【问题描述】:我在视图中有一个列表。在列表中,items被迭代以填充列表。当... 查看详情

如何让 Drupal 8 视图与 GraphQL / Gatsby.js 一起使用

】如何让Drupal8视图与GraphQL/Gatsby.js一起使用【英文标题】:HowtogetDrupal8ViewsworkingwithGraphQL/Gatsby.js【发布时间】:2020-02-0620:19:06【问题描述】:我正在努力寻找答案,因为我不确定这是Drupal、GraphQl还是Gatsby问题。我正在构建一个... 查看详情

如何让模型验证与 Rails 中的视图层对话以提供简单的功能?

】如何让模型验证与Rails中的视图层对话以提供简单的功能?【英文标题】:HowtogetmodelvalidationstotalkwithviewlayerinRailstoprovidesimplefunctionality?【发布时间】:2012-06-2322:09:37【问题描述】:我有一个Room模型,它验证了它的房间号是唯... 查看详情

无法在 Knockout.js 中绑定具有复杂对象的视图

】无法在Knockout.js中绑定具有复杂对象的视图【英文标题】:UnabletobindaviewwithcomplexobjectinKnockout.js【发布时间】:2014-06-1717:04:45【问题描述】:我正在尝试使用KnockOut.js在视图上绑定复杂对象。在不使用overservable()和observableArray()... 查看详情

ComposeView 与视图绑定

】ComposeView与视图绑定【英文标题】:ComposeViewwithviewbinding【发布时间】:2021-11-2623:57:12【问题描述】:我在我的XML布局文件中添加了ComposeView。我在我的活动中使用视图绑定来扩充这个文件。当我尝试调用binding.myComposeView.setConte... 查看详情

视图绑定(viewbinding)与数据绑定(databinding)(代码片段)

视图绑定(ViewBinding)与数据绑定(Databinding)什么是ViewBindingviewbinding是androidjetpack的一个特性,通过viewbinding功能,您可以更轻松地编写可与视图交互的代码。在模块中启用viewbinding之后,系统会为该... 查看详情