Как узнать размер View элементов в адаптере?

258
09 августа 2017, 18:16

У меня есть 2 View ImageVIew и TextView. getView getHeight возвращяет 0.

Как мне узнать размер ImageVIew и TextView в Адаптере RecyclerView. Может есть слушатель какой - нибудь для BindView?

Или можете мне сказать как рассчитать размеры элементов в XML. через LayoutInflater. А уже после я бы запустил адаптер....

Это мой ужасный код

@Override
    public void onBindViewHolder(final ViewHolder holder, final int position) {
//        RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) holder.icon.getLayoutParams();
//        if ((position & 1) == 0) layoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
//        else layoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
        holder.icon.post(new Runnable()
        {
            @Override
            public void run()
            {
                final int imgW = holder.icon.getWidth();
                final int imgH = holder.icon.getHeight();
                holder.messageView.post(new Runnable() {
                    @Override
                    public void run() {
                        int txtH=holder.messageView.getLineHeight();
                        SpannableString ss = new SpannableString(Html.fromHtml(str[0]));
                        int lines=imgH/txtH;
                        ss.setSpan(new TextViewMarginSpan(imgW,lines), 0, ss.length(), 0);
                        holder.messageView.setText(ss);
                    }
                });
            }
        });
    }

Хочу сделать вот так

Answer 1

Узнать размер View можно только после того, как все элементы Layout сформированы. Для этого существует OnGlobalLayoutListener

ViewTreeObserver vto = view.getViewTreeObserver();
        vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
             // view сформирован, можно получать размеры
            });
Answer 2

Если размер View указан в dp/sp/px то можете перевести их в пиксели. Если View во всю ширину экрана то берете ширину экрана минус маргины (если есть).

Если ширина указана с весом, к примеру 0.3, то делите ширину экрана на 100 и умножайте на 30.

В этих случаях лучше считать размеры в конструкторе адартере единожды

Если в вашем случае так сделать нельзя, то вот, на худой конец юзайте

view.post(new Runnable()
{
    @Override
    public void run()
    {
        int w = view.getWidth();
        int h = view.getHeight();
    }
});
Answer 3

Гораздо удобней использовать post

view.post(new Runnable() {
            @Override
            public void run() {
               view.getWidth(); 
            }
        });

Только в своем примере замените на свой view. Размер расчитается ровно после того, как вьюшка будет сформирована на разметке

Answer 4

Попробуйте получать размеры через LayoutParams так:

int width = view.getLayoutParams().width;

Ещё можно вот так попробовать рассчитать размеры. Этот способ позволит получить размеры до отрисовки, синхронно:

textView.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
int height = textView.getMeasuredHeight();
int width= textView.getMeasuredWidth();
READ ALSO
Почему не работает multitouch?

Почему не работает multitouch?

На экране элементы ImageView и SeekBarодновременно нужно двигать оба элемента: менять значение seekbar и перемещать imageView

364
Внедрение docker образа в docker образ

Внедрение docker образа в docker образ

Есть приложение, которое взаимодействует с базой данных, база данных - является docker образом, накатывание базы данных происходит через liquibase...

244
JSP в J2EE. Создание стартовой страницы

JSP в J2EE. Создание стартовой страницы

Здравствуйте! Я начинаю изучать J2EE и у меня вопрос, как мне изменить страницу поздравления с indexhtml на допустим new

232
Вставка файла html в html файл на сервере (include)?

Вставка файла html в html файл на сервере (include)?

В ASP есть команда, которая вставляет один файл html в другой

313