#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);
}
}
}