Android 在数据绑定中设置动态布局高度
我想在数据绑定结构中设置动态布局高度 我尝试了一些东西,但我得到了一个例外:Android 在数据绑定中设置动态布局高度,android,data-binding,android-databinding,Android,Data Binding,Android Databinding,我想在数据绑定结构中设置动态布局高度 我尝试了一些东西,但我得到了一个例外: java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.Integer.intValue()' on a null object reference at databinding.ItemGroupCommentsBinding.executeBindings(ItemGroupC
java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.Integer.intValue()' on a null object reference
at databinding.ItemGroupCommentsBinding.executeBindings(ItemGroupCommentsBinding.java:147)
at android.databinding.ViewDataBinding.executePendingBindings(ViewDataBinding.java:355)
at view.base.adapter.DataBindingAdapter.onBindViewHolder(DataBindingAdapter.java:32)
at view.base.adapter.DataBindingAdapter.onBindViewHolder(DataBindingAdapter.java:15)
at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6279)
at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6312)
at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5258)
at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5521)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5363)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5359)
at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2141)
at android.support.v7.widget.GridLayoutManager.layoutChunk(GridLayoutManager.java:556)
at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1488)
at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:585)
at android.support.v7.widget.GridLayoutManager.onLayoutChildren(GridLayoutManager.java:170)
at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3506)
at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3254)
at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3767)
at android.view.View.layout(View.java:15604)
at android.view.ViewGroup.layout(ViewGroup.java:4966)
at android.support.v4.widget.SwipeRefreshLayout.onLayout(SwipeRefreshLayout.java:636)
at android.view.View.layout(View.java:15604)
at android.view.ViewGroup.layout(ViewGroup.java:4966)
at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1076)
at android.view.View.layout(View.java:15604)
at android.view.ViewGroup.layout(ViewGroup.java:4966)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:573)
at android.widget.FrameLayout.onLayout(FrameLayout.java:508)
at android.view.View.layout(View.java:15604)
at android.view.ViewGroup.layout(ViewGroup.java:4966)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:573)
at android.widget.FrameLayout.onLayout(FrameLayout.java:508)
at android.view.View.layout(View.java:15604)
at android.view.ViewGroup.layout(ViewGroup.java:4966)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
at android.view.View.layout(View.java:15604)
at android.view.ViewGroup.layout(ViewGroup.java:4966)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:573)
at android.widget.FrameLayout.onLayout(FrameLayout.java:508)
at android.view.View.layout(View.java:15604)
at android.view.ViewGroup.layout(ViewGroup.java:4966)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:573)
at android.widget.FrameLayout.onLayout(FrameLayout.java:508)
at android.view.View.layout(View.java:15604)
at android.view.ViewGroup.layout(ViewGroup.java:4966)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
at android.view.View.layout(View.java:15604)
at android.view.ViewGroup.layout(ViewGroup.java:4966)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:573)
at android.widget.FrameLayout.onLayout(FrameLayout.java:508)
代码是:
Fragment.java:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
db = DataBindingUtil.inflate(inflater, R.layout.fragment_group_comments, container, false);
getSubComponent().inject(this);
db.setVariable(BR.height, 0);
// Inflate the layout for this fragment
return db.getRoot();
}
@BindingAdapter("android:layout_height")
public static void setLayoutHeight(View view, float commentNumber) {
Timber.e("setLayoutHeight " + commentNumber);
try {
GridLayoutManager.LayoutParams layoutParams =
(GridLayoutManager.LayoutParams) view.getLayoutParams();
if (10 <= commentNumber && commentNumber < 10) {
layoutParams.height = 400;
} else if (11 <= commentNumber && commentNumber < 20) {
layoutParams.height = 500;
}
view.setLayoutParams(layoutParams);
} catch (Exception ignore) {}
}
@覆盖
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
db=DataBindingUtil.inflate(充气器,R.layout.fragment\u group\u注释,容器,false);
getSubComponent().inject(此);
db.setVariable(BR.height,0);
//为该碎片膨胀布局
返回db.getRoot();
}
@BindingAdapter(“安卓:布局高度”)
公共静态void setLayouthweight(视图、浮点注释编号){
木材.e(“SetLayouthweight”+编号);
试一试{
GridLayoutManager.LayoutParams LayoutParams=
(GridLayoutManager.LayoutParams)view.getLayoutParams();
如果(10您需要在绑定适配器中将commentNumber
类型从float
更改为Integer
或更改为int
:
@BindingAdapter("android:layout_height")
public static void setLayoutHeight(View view, Integer commentNumber) {
// your code staff
}
检查,其中@BindingAdapter
用于设置视图的填充。这里有一个示例BindingAdapter
,它可以动态设置视图的高度。它使用两种不同的布局参数
类型。如果缺少所需的类型,只需在选项时将其添加为下一个
import org.jetbrains.anko.dip
/**
* Set the view's height using Android Binding adapter
*
* Usage:
* <LinearLayout
* android:layout_width="match_parent"
* android:layout_height="wrap_content"
* app:dynamicHeight="@{viewModel.myCustomHeight}" />
*
* @param dpHeight height in density-independent pixels [ObservableInt].
* @author Bartosz Kosarzycki
*/
@BindingAdapter("dynamicHeight")
fun View.setDynamicHeight(dpHeight: ObservableInt) {
val pxHeight = dip(dpHeight.get())
when (this.layoutParams) {
is LinearLayout.LayoutParams ->
this.layoutParams = LinearLayout.LayoutParams(layoutParams.width, pxHeight)
is RelativeLayout.LayoutParams ->
this.layoutParams = RelativeLayout.LayoutParams(layoutParams.width, pxHeight)
is ViewGroup.LayoutParams ->
this.layoutParams = ViewGroup.LayoutParams(layoutParams.width, pxHeight)
else -> throw RuntimeException("No such view type in 'dynamicHeight' binding adapter")
}
}
import org.jetbrains.anko.dip
/**
*使用Android绑定适配器设置视图的高度
*
*用法:
*
*
*@param dpHeight高度(以密度无关的像素为单位)[可观察]。
*@作者Bartosz Kosarzycki
*/
@BindingAdapter(“动态灯光”)
有趣的视图。设置动态灯光(dpHeight:ObservableInt){
val pxHeight=dip(dpHeight.get())
何时(this.layoutParams){
是LinearLayout.LayoutParams->
this.layoutParams=LinearLayout.layoutParams(layoutParams.width,pxHeight)
是RelativeLayout.LayoutParams->
this.layoutParams=RelativeLayout.layoutParams(layoutParams.width,pxHeight)
是ViewGroup.LayoutParams->
this.layoutParams=ViewGroup.layoutParams(layoutParams.width,pxHeight)
else->throw RuntimeException(“dynamicHeight”绑定适配器中没有此类视图类型”)
}
}
当布局xml的数据绑定初始化时,您何时调用了setLayouthweight
方法?@Huy TowerinonCreateView
。现在一切正常。谢谢。
import org.jetbrains.anko.dip
/**
* Set the view's height using Android Binding adapter
*
* Usage:
* <LinearLayout
* android:layout_width="match_parent"
* android:layout_height="wrap_content"
* app:dynamicHeight="@{viewModel.myCustomHeight}" />
*
* @param dpHeight height in density-independent pixels [ObservableInt].
* @author Bartosz Kosarzycki
*/
@BindingAdapter("dynamicHeight")
fun View.setDynamicHeight(dpHeight: ObservableInt) {
val pxHeight = dip(dpHeight.get())
when (this.layoutParams) {
is LinearLayout.LayoutParams ->
this.layoutParams = LinearLayout.LayoutParams(layoutParams.width, pxHeight)
is RelativeLayout.LayoutParams ->
this.layoutParams = RelativeLayout.LayoutParams(layoutParams.width, pxHeight)
is ViewGroup.LayoutParams ->
this.layoutParams = ViewGroup.LayoutParams(layoutParams.width, pxHeight)
else -> throw RuntimeException("No such view type in 'dynamicHeight' binding adapter")
}
}