Как я могу получить ширину в значениях для любого макета или представления карты внутри класса адаптера? У меня есть файл макета, который я использую для пользовательского класса адаптера, где я использовал представление, представляющее собой представление карты, и заданную ширину в качестве родительского элемента теперь в классе адаптера. Мне нужна ширина представления карты в значениях. Я пробовал несколько методов, например, используя метод 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
}
Мне просто нужна его фактическая ширина в значениях для дальнейшего преобразования в моем коде.
сэр, это неправильный способ, потому что он дает неверные данные




Вы можете получить/установить любой параметр макета программно 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
например, вы можете увидеть мои текстLog пробеги до получения ширины. Причина в том, что мой bindviewholder находится в процессе установки данных для просмотра. После завершения процесса он предоставит правильное значение моего width.
Та же проблема происходит с вами. как вы прокомментировали, ваши значения возвращают 0 вне функции. это потому, что вне функции ваш onbindviewholder в процессе.
Лучший способ решить вашу проблему -
Вы можете использовать Общие настройки для сохранения ширины в Local. Для объяснения вы можете проверить ответ это, он предоставил правильный способ сделать это.
Если я могу чем-то помочь, просто прокомментируйте вашу проблему
чего вы хотите достичь, получая соответствие родительской ширине?