Я предполагаю, что XML, который вы представили, предназначен для каждого из элементов в RecyclerView
, и вы хотите, чтобы каждый элемент занимал 1/3 высоты RecyclerView
.Элемент RecyclerView
создается в onCreateViewHolder()
адаптера и обычно просто учитывает его собственное содержимое и увеличивает его до размера, необходимого для хранения содержимого.
Требуется наложить внешнее требованиечто предмет RecyclerView
должен занимать 1/3 высоты RecyclerView
.Нет никакого способа сделать это в XML, поэтому вам придется прибегнуть к коду.
Я думал, что это будет легко, но это немного сложно, но потерпите меня.
Вам нужно будет определить высоту RecyclerView
, чтобы вы могли вычислить 1/3 этого значения как высоту каждого элемента.К сожалению, как я обнаружил, высота RecyclerView
не определяется до тех пор, пока не будут созданы держатели вида.Итак, мы находимся в затруднительном положении: нам нужна высота RecyclerView
, чтобы построить держатели вида, но держатели вида должны быть построены, чтобы определить высоту RecyclerView
.
Чтобы обойти этоМы установим высоту RecyclerView
на match_parent
.Это сделает RecyclerView
таким же высоким, как и его родитель.Мы можем получить высоту, если родительский элемент до RecyclerView
полностью измерен.Мы будем использовать глобальный слушатель расположения, чтобы захватить высоту родителя.Этот код должен выполняться после создания RecyclerView
(здесь mRecyclerView
) и до установки адаптера.В моем наборе тестов он определил onCreate()
активности.
mRecyclerView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
// Remove the listener so we don't get called again.
mRecyclerView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
// Capture the height of the parent view group.
int height = ((ViewGroup) mRecyclerView.getParent()).getHeight();
// And let the adapter know the height.
adapter.setItemHeight(height);
// Now that we know the height of the RecyclerView and its items, we
// can set the adapter so the items can be created with the proper height.
mRecyclerView.setAdapter(adapter);
}
});
Добавьте setItemHeight()
к адаптеру, чтобы зафиксировать высоту элемента.
private int mItemHeight;
public void setItemHeight(int parentHeight) {
mItemHeight = parentHeight / 3;
}
Наконец,мы можем использовать высоту элемента для создания элементов:
@Override
public ItemHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false);
view.getLayoutParams().height = mItemHeight;
return new ItemHolder(view);
}
Вам может потребоваться настроить высоту элемента, если RecyclerView
имеет отступы, поля или украшения.