Пожалуйста, не ставьте под сомнение «почему» этой проблемы. Я столкнулся с этим, пока создавал прототипы некоторых вещей, поэтому, вероятно, никогда не закончится в выпущенной версии. Но что случилось, я встревожил меня.У RecyclerView не должно быть слишком много предметов?
Я использую RecyclerView
с горизонтальной ориентацией LinearLayoutManager
.
Я хотел создать огромный адаптер, неограниченное количество предметов. Так что я сделал:
@Override
public int getItemCount() {
return Integer.MAX_VALUE;
}
и повторно использовать элементы:
@Override
public void onBindViewHolder(final RecyclerViewHolder holder, int position) {
position = position % (items.size() - 1);
...
// set the data
...
Я имею в макете КСТАТИ несколько RecyclerView
, просто FYI.
Что происходит дальше, что приложение зависает при запуске, и, наконец, бросает эту StackTrace:
E/AndroidRuntime(3296): java.lang.StackOverflowError
E/AndroidRuntime(3296): at android.support.v7.widget.ChildHelper$Bucket.insert(ChildHelper.java:411)
E/AndroidRuntime(3296): at android.support.v7.widget.ChildHelper$Bucket.insert(ChildHelper.java:401)
E/AndroidRuntime(3296): at android.support.v7.widget.ChildHelper$Bucket.insert(ChildHelper.java:401)
E/AndroidRuntime(3296): at android.support.v7.widget.ChildHelper$Bucket.insert(ChildHelper.java:401)
E/AndroidRuntime(3296): at android.support.v7.widget.ChildHelper$Bucket.insert(ChildHelper.java:401)
E/AndroidRuntime(3296): at android.support.v7.widget.ChildHelper$Bucket.insert(ChildHelper.java:401)
E/AndroidRuntime(3296): at android.support.v7.widget.ChildHelper$Bucket.insert(ChildHelper.java:401)
E/AndroidRuntime(3296): at android.support.v7.widget.ChildHelper$Bucket.insert(ChildHelper.java:401)
E/AndroidRuntime(3296): at android.support.v7.widget.ChildHelper$Bucket.insert(ChildHelper.java:401)
...
Он не должен Mather, сколько элементов у вас есть адаптер, но некоторые, как это слишком много , Есть ли какая-то предварительная работа для каждого элемента?
IMO, ваша ошибка заключается в использовании 'return Integer.MAX_VALUE;' потому что теоретически вы хотите, чтобы в списке было огромное количество элементов, но 'now' его нет, тогда как' getCount() 'должен возвращать CURRENT количество элементов в адаптер, а не 'to be' count – Yazan
@Yazan Я пытаюсь получить что-то вроде бесконечного списка циклов. Я подделал его, сделав его огромным и сделав по модулю при заполнении ViewHolder. И все же: почему происходит stackoverflow? Не уверен, что вы имеете в виду со своим комментарием – Boy
, я сказал теоретически, потому что вы можете получить «OutOfMemoryException» перед добавлением элементов «Integer.MAX_VALUE» в адаптер, поэтому это значение никогда не сможет вернуться с помощью 'getCount()', так же как и вы добавьте объекты Integer.MAX_VALUE в адаптер, я думаю, что ответ «Нет», поэтому вам нужно добавить элементы к адаптеру, попробуйте подсчитать значение «Integer.MAX_VALUE» и пусть 'getCount()' возвращает все значения, которые вы считаете иметь. – Yazan