如果在 Android 的 xml 文件中定义为匹配父项,如何在任何适配器 class 中获取值的实际视图宽度

How to get the actual width of view in values in any adapter class if it is define as match parent in xml file in Android

如何获取适配器 class 内任何布局或卡片视图的宽度值? 我有一个用于自定义适配器 class 的布局文件,我在其中获取了卡片视图的视图,并且现在在适配器 class 中将宽度作为匹配父级给出 我想要卡片视图宽度的值. 我尝试了多种方法,例如,将 post 方法与卡片视图或视图树观察器一起使用。

CardView mCardView;
int width=0;
int rootWidth,rootHeight;
mCardView = itemview.findViewById(R.id.mCardView);

// Method in Recyclerview Adapter Class
public void onBindHolder(final ViewHolder holder, final int position)
{
    // using viewtreeobserver to get width of view 
    ViewTreeObserver vto = mCardView.getViewTreeObserver();
    vto.addOnGlobalLayoutListener(new 
        ViewTreeObserver.OnGlobalLayoutListener()
            {
                @Override
                public void onGlobalLayout() {
                    rootHeight = mCardView.getHeight();
                    rootWidth = mCardView.getWidth();
                }
            });
    }

    //Another method tried to get the width of the view 

    mCardView.post(new Runnable() {
        @Override
        public void run() {
            rootHeight = mCardView.getHeight();
            rootWidth = mCardView.getWidth();
        }
    });

     width = rootWidth;  //always return 0 in both th cases

}

您可以 get/set 任何布局参数以编程方式 getLayoutParams() 任何视图的方法。例如,如果你想要高度,那么你可以使用 iv.getLayoutParams().height

以上答案参考。 https://developer.android.com/reference/android/widget/LinearLayout.LayoutParams

您得到空值的原因。

为此,我将提供示例:

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.card?.viewTreeObserver?.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener{
            override fun onGlobalLayout() {
                holder.card?.getViewTreeObserver()?.removeGlobalOnLayoutListener(this);
                Log.e("widths", holder.card?.measuredWidth.toString())
            }
        })
        Log.e("text","i am here")
    }

这段代码的输出是:

E/text: i am here
E/text: i am here
E/widths: 1080
E/widths: 1080

根据示例,您可以看到我的 text Log 在获取宽度之前运行。背后的原因是我的 bindviewholder 正在设置要查看的数据。处理完成后,它将提供我的 width.

的正确值

您也遇到了同样的问题。正如您评论的那样,您的价值 return 0 是外部功能。这是因为在函数之外,您的 onbindviewholder 正在处理中。

解决您问题的更好方法是

您可以使用 SharedPreferences 在 Local 中存储您的宽度。 有关解释,您可以查看 答案,他提供了正确的方法。

如果有什么我可以帮忙的,请评论你的问题