2015-12-09 1 views
1

RecyclerView с wrap_content и GridLayoutManager не отображает элементы. Он не увеличивается, чтобы освободить место для предметов.GridLayoutManager на обернутом макете не имеет размера для RecyclerView для отображения позиций

Прежде всего, я заметил there is an issue (74772) open for it, но он еще не решен до декабря 2015 года и not until “early 2016”.

Кто-то, казалось, сделал это CustomGridLayoutManager, также available on Github, но она до сих пор, кажется, не делают достаточно места для всех деталей, что делает RecyclerView появляются укороченные (но прокручивать), даже когда есть достаточно места для RecyclerView в его родитель.

Любые идеи относительно того, как сделать RecyclerView должным образом размер элементов и показать его без прокрутки, когда это возможно?

ответ

-1

Этот класс, по-видимому, учитывает при измерении только первый ребенок и первый ребенок каждой строки (в зависимости от того, какое из размеров назначено, зависит от ориентации). Смотрите это (комментарии от меня):

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.

Как указано в комментариях к выпуску, вы должны обратить внимание на RecyclerViewState, используя вместо него getItemCount(). Я также рекомендую взглянуть на getViewForPosition(int), чтобы узнать, могут ли это повлиять на условия предварительного отключения и т. Д.

+1

Для downvoter было бы неплохо узнать, что здесь не так. Это определенно не является технически совершенным (учитывая все случаи), но для моего случая он решил проблему, которую я имел. Для любой другой вещи было бы неплохо услышать любые детали, которые вы, возможно, знаете, которые могли бы улучшить то, что у меня есть. – davidcesarino

Смежные вопросы