- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个 RecyclerView,为此我有一个自定义适配器,并且我已将 LayoutManager 设置为 FlexboxLayoutManager。对于每个 child ,我想将 FlexGrow 设置为 1。
在 Google 的示例 demo-cat-gallery ( https://github.com/google/flexbox-layout ) 中,他们在 ViewHolder 中执行此操作:
void bindTo(Drawable drawable) {
mImageView.setImageDrawable(drawable);
ViewGroup.LayoutParams lp = mImageView.getLayoutParams();
if (lp instanceof FlexboxLayoutManager.LayoutParams) {
FlexboxLayoutManager.LayoutParams flexboxLp = (FlexboxLayoutManager.LayoutParams) lp;
flexboxLp.setFlexGrow(1.0f);
}
}
然后由 onBindViewHolder 中的 RecyclerView.Adapter 调用。这工作正常,但是当我在我的应用程序中执行相同操作时,它只会为某些项目设置 FlexGrow,而不会为顶部的项目设置 FlexGrow。我意识到对于某些项目(看似随机),getLayoutParams() 返回 null,但对于其他项目,它返回正确的 FlexboxLayoutManager.LayoutParams。
我意识到不同之处在于在 Cat-gallery 示例中,onCreateViewHolder 正在做
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
{
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.viewholder_cat, parent, false);
return new CatViewHolder(view);
}
在我的应用程序中我正在做
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
{
return new MyViewHolder(new MyCustomView(getContext()));
}
似乎用对父级的引用膨胀意味着 getLayoutParams() 永远不会为 null,所以将我的代码更改为
View v = new MyCustomView(getContext());
parent.addView(v);
return new MyViewHolder(v);
现在它可以正常工作,setFlexGrow() 始终处于设置状态。但是,这感觉不对 - 我知道您不打算将 View 显式添加到 RecyclerView 父级。
所以我的问题是:
1 - 为什么 LayoutParams 对于某些项目随机为 null,但对于其他项目却没问题?
2 - 我怎样才能让 LayoutParams 始终被设置,而不做像“parent.addView(v);”这样可怕的事情,或者这样做真的可以吗?
谢谢:)
最佳答案
这似乎是 FlexboxLayoutManager 的错误。我试过做
parent.addView(v);
但这产生了非常奇怪的崩溃。
事实证明,尽管 FlexboxLayoutManager 可能不会在 onBindViewHolder
之前附加 LayoutParams,但它会在 onViewAttachedToWindow
之前附加 LayoutParams。所以你可以像这样设置 LayoutParams:
override fun onViewAttachedToWindow(holder: ViewHolder<View>) {
super.onViewAttachedToWindow(holder)
holder.itemView.updateLayoutParams {
// Whatever
}
}
旧答案:仍然有效,但比较笨拙。
最后我产生了这个解决方法:
parent.addView(v);
ViewGroup.LayoutParams params = v.getLayoutParams();
parent.removeView(v);
v.setLayoutParams(params);
关于android - RecyclerView getLayoutParams 返回 null(有时),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45242737/
我创建了一个扩展 View 的类: public class BoardView extends View { 并且我在应用程序的 main.xml 文件中指定了 BoardView 的宽度和高度:
我有一个自定义的 ImageView 类(我认为类中的代码并不重要,但无论如何我都会将其包含在这里以防万一): package com.example.vroy.customcirclebut
我试图在我的函数中获取 android:layout_weight。这是我的 xml 代码: ...... 我的功能部分: import android.widget.Li
如果我想在 Java 中以编程方式设置 ImageView 的宽度/高度,如下所示: image_view.getLayoutParams().width = 200; “200”的单位是什么?是px
我正在尝试以编程方式设置布局宽度。 ViewTreeObserver vtoRecyclerView = mMainLayout.getViewTreeObserver(); vto
例如,如果你想将某些 View 的 LayoutParams 更改为 WRAP_CONTENT,同时 width 和 height以编程方式,它看起来像这样: final ViewGroup.Lay
我已经编写了代码来动态设置 View 的高度和宽度 view.getLayoutParams().width = 120; view.getLayoutParams().height = 120; 它
View 的 getHeight() 和 getLayoutParams().height 有什么区别?我有一个 View (GoogleAdView),我想隐藏它,我将 getLayoutParam
我有以下看法: 我正在我的项目中实现一个计时器。因此,每秒调用一次函数 onTick(): public void onTick(long millisUntilFinished) {
我有一个 Seekbar,除了一个部分外,它工作得很好。我想根据 Seekbar 值调整 textView 的高度。 我正在使用这段代码来调整 textView 的高度: SeekBar sb1 =
我正在用这个简单的方法以编程方式创建一个小部件 private ImageView getModuleIconView(Module module) { ImageView view = ne
当我像这样在 RecyclerView.Adapter 中使用 ViewBinding 时: override fun onCreateViewHolder(parent: ViewGroup, vi
当我像这样在 RecyclerView.Adapter 中使用 ViewBinding 时: override fun onCreateViewHolder(parent: ViewGroup, vi
我有一个带有一个 View 对象(一个简单的位图)的RelativeLayout。为了兼容性,我使用 getLayoutParams() 和 setLayoutParams() 来移动它。 但是,当从
我有一个 RecyclerView,为此我有一个自定义适配器,并且我已将 LayoutManager 设置为 FlexboxLayoutManager。对于每个 child ,我想将 FlexGrow
如果我声明 LinearLayout linearLayout 并查看 linearLayout.getLayoutParams(),它会给我 ViewGroup.LayoutParams,而不是 L
在 xml 中获取我的 TextView: 我想创建多个 TextView,但我希望它们看起来与this 相同。 所以我尝试了: TextView newTextView = new TextVie
这是我创建新 ImageView 的源代码: ImageView image = new ImageView(this); LinearLayout.LayoutParams params =
本文整理了Java中com.google.android.youtube.player.YouTubeThumbnailView.getLayoutParams()方法的一些代码示例,展示了YouTu
我有一个 Android 对话框,我想将其放置在其窗口中的特定位置。 我正在使用 API 8 为什么int a == -2和int b == 153不是正数? 有什么区别 getLayoutParam
我是一名优秀的程序员,十分优秀!