как обновить высоту представления внутри scrollview (NestedScrollView)

#android #android-recyclerview #scrollview

#Android #android-recyclerview #просмотр прокрутки

Вопрос:

У меня есть a RecyclerView с wrap_content в высоту внутри a NestedScrollView . Я пытаюсь обновить эту высоту во время выполнения, когда получаю ответ от API. Поэтому, когда получен ответ, я помещаю элементы в recyclerview, пытаюсь обновить его высоту, но это не работает. Когда я принудительно приостанавливаю / возобновляю состояния, возвращаясь к своему приложению, высота recyclerview отображается правильно. Что заставляет Android обновлять все представления?

Комментарии:

1. вы хотите обновить элемент повторного просмотра (добавить или изменить строку)?

2. Я хочу обновить его высоту после получения и добавления элементов

3. после добавления вашего нового элемента в arraylist элемента и вызова метода notifyDataSetChanged () вашего адаптера recycleview он автоматически обновит высоту вашего представления

4. проблема не в добавлении элементов. Проблема заключается в изменении размера (высоты) recyclerview внутри scrollview после загрузки элементов.

5. @ClarkXP вы когда-нибудь находили ответ на этот вопрос?

Ответ №1:

Отвечая на комментарий @mehdi akbar, вы можете попытаться вызвать notifyDataSetChanged() в нужное время (когда придет ответ)

 public void onResponse(.....){
  //do stuff with data

  mAdapter.notifyDataSetChanged();
}  
 

все измерения, выполняемые базовым менеджером компоновки, будут повторены, и будет сгенерирован новый макет.

Комментарии:

1. проблема не в добавлении элементов. Проблема заключается в изменении размера (высоты) recyclerview внутри scrollview после загрузки элементов.

Ответ №2:

Моя аналогичная ситуация:

 ScrollView -> normal LinearLayout(MATCH, WRAP, vertical) -> custom SizeCappedLinearLayout(MATCH, WRAP, horizontal)
 

Я хотел установить максимальную высоту для всех динамических элементов внутри ScrollView на основе высоты внешнего (заголовка) представления. Сложность заключалась в том, что высота представления заголовка вычисляется очень поздно, скажем, после изменения ориентации. Простая настройка LayoutParams была недостаточно гибкой.

 View heightLink = activ.findViewById(R.id.someHeaderView);
SizeCappedLinearLayout scrollLine = new SizeCappedLinearLayout(activ);
scrollLine.setHeightLink(heightLink);
scrollLine.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT));
scrollLine.setOrientation(LinearLayout.HORIZONTAL);
 

Пользовательский объект просмотра:

 public class SizeCappedLinearLayout extends LinearLayout {
    private View widthLink = null;
    private View heightLink = null;

    public SizeCappedLinearLayout(Context context) {
        super(context);
    }

    protected void setWidthLink(View v) {
        widthLink = v;
    }

    protected void setHeightLink(View v) {
        heightLink = v;
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        if(widthLink != null) {
            heightMeasureSpec = getLinkedSpec(widthLink.getMeasuredHeight(), widthLink.getHeight());
        }
        if(heightLink != null) {
            heightMeasureSpec = getLinkedSpec(heightLink.getMeasuredHeight(), heightLink.getHeight());
        }
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    private int getLinkedSpec(int measureDim, int dim) {
        if(dim > 0) {
            return MeasureSpec.makeMeasureSpec(dim, MeasureSpec.AT_MOST);
        } else {
            return MeasureSpec.makeMeasureSpec(measureDim, MeasureSpec.AT_MOST);
        }
    }
}