Как получить фактическую ширину представления в значениях в любом классе адаптера, если он определен как родитель совпадения в файле xml в Android

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

}

чего вы хотите достичь, получая соответствие родительской ширине?

Tejas Pandya 29.06.2019 14:01

Мне просто нужна его фактическая ширина в значениях для дальнейшего преобразования в моем коде.

palak patel 29.06.2019 14:03

сэр, это неправильный способ, потому что он дает неверные данные

Ashish 29.06.2019 14:58
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
319
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете получить/установить любой параметр макета программно 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. Для объяснения вы можете проверить ответ это, он предоставил правильный способ сделать это.

Если я могу чем-то помочь, просто прокомментируйте вашу проблему

Другие вопросы по теме