Как получить фактическую ширину просмотра в значениях в любом классе адаптера, если он определен как совпадающий родительский в файле XML в Android - PullRequest
0 голосов
/ 29 июня 2019

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

}

Ответы [ 2 ]

0 голосов
/ 29 июня 2019

Причина, по которой вы получаете нулевое значение.

Для этого я приведу пример:

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 в процессе.

Лучший способ решить вашу проблему -

. Вы можете использовать SharedPreferences , чтобы сохранить ширину в Local.Для объяснения вы можете проверить этот ответ, который он предоставил надлежащим способом сделать это.

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

0 голосов
/ 29 июня 2019

Вы можете получить / установить любой параметр макета программно getLayoutParams() метод любого представления.например, если вы хотите высоту, вы можете использовать iv.getLayoutParams().height

Ссылка выше ответ.https://developer.android.com/reference/android/widget/LinearLayout.LayoutParams

...