Этот класс, по-видимому, учитывает при измерении только первый ребенок и первый ребенок каждой строки (в зависимости от того, какое из размеров назначено, зависит от ориентации). Смотрите это (комментарии от меня):
if (getOrientation() == HORIZONTAL) {
if (i % getSpanCount() == 0) { // only for first child of row.
width = width + mMeasuredDimension[0];
}
if (i == 0) { // only for first item.
height = mMeasuredDimension[1];
}
}
Что-то происходит с идентичными ориентации VERTICAL
(пойманные в else
, который следует).
Чтобы учесть мои потребности, я измерил каждый ребенок, проверив самый большой ребенок в каждой строке, а затем применив максимальные ограничения к строке. Когда каждая строка была закончена, размер строки был добавлен к общему размеру, который был необходим.
if (getOrientation() == VERTICAL) {
rowMeasure[1] = Math.max(rowMeasure[1], childMeasure[1]);
rowMeasure[0] += childMeasure[0];
} else {
rowMeasure[0] = Math.max(rowMeasure[0], childMeasure[0]);
rowMeasure[1] += childMeasure[1];
}
// When finishing the row (last item of row), adds the row dimensions to the view.
if (i % getSpanCount() == getSpanCount() - 1 || i == state.getItemCount() - 1) {
rowsSized[addIndex] += rowMeasure[addIndex];
rowsSized[maxIndex] = Math.max(rowsSized[maxIndex], rowMeasure[maxIndex]);
rowMeasure[addIndex] = 0;
rowMeasure[maxIndex] = 0;
}
Полный класс доступен в конце этого ответа. Вышеизложенное показывает только логику.
Я еще не полностью протестировал это решение, так как на этой неделе я столкнулся с этим вопросом и попытался его решить - опять же, по крайней мере, для моих нужд - вчера (декабрь 08).
Вы можете проверить, как я справился с этой проблемой с помощью моего here.
Как указано в комментариях к выпуску, вы должны обратить внимание на RecyclerView
State
, используя вместо него getItemCount()
. Я также рекомендую взглянуть на getViewForPosition(int)
, чтобы узнать, могут ли это повлиять на условия предварительного отключения и т. Д.
Для downvoter было бы неплохо узнать, что здесь не так. Это определенно не является технически совершенным (учитывая все случаи), но для моего случая он решил проблему, которую я имел. Для любой другой вещи было бы неплохо услышать любые детали, которые вы, возможно, знаете, которые могли бы улучшить то, что у меня есть. – davidcesarino