2015-01-29 2 views
2

Пожалуйста, не ставьте под сомнение «почему» этой проблемы. Я столкнулся с этим, пока создавал прототипы некоторых вещей, поэтому, вероятно, никогда не закончится в выпущенной версии. Но что случилось, я встревожил меня.У 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, сколько элементов у вас есть адаптер, но некоторые, как это слишком много , Есть ли какая-то предварительная работа для каждого элемента?

+0

IMO, ваша ошибка заключается в использовании 'return Integer.MAX_VALUE;' потому что теоретически вы хотите, чтобы в списке было огромное количество элементов, но 'now' его нет, тогда как' getCount() 'должен возвращать CURRENT количество элементов в адаптер, а не 'to be' count – Yazan

+0

@Yazan Я пытаюсь получить что-то вроде бесконечного списка циклов. Я подделал его, сделав его огромным и сделав по модулю при заполнении ViewHolder. И все же: почему происходит stackoverflow? Не уверен, что вы имеете в виду со своим комментарием – Boy

+0

, я сказал теоретически, потому что вы можете получить «OutOfMemoryException» перед добавлением элементов «Integer.MAX_VALUE» в адаптер, поэтому это значение никогда не сможет вернуться с помощью 'getCount()', так же как и вы добавьте объекты Integer.MAX_VALUE в адаптер, я думаю, что ответ «Нет», поэтому вам нужно добавить элементы к адаптеру, попробуйте подсчитать значение «Integer.MAX_VALUE» и пусть 'getCount()' возвращает все значения, которые вы считаете иметь. – Yazan

ответ

0

У меня была такая же проблема. Я воспроизвел его только на KitKat. Мой взгляд содержит RecyclerView с огромным адаптером (Integer.MAX_VALUE) для реализации какой-то бесконечной прокрутки. На KitKat у меня было StackOverflowError с одинаковым стеклом. Я заметил, что эта ошибка произошла, только если мой RecyclerView был обернут FrameLayout с layout_weight=0. Поэтому я просто переписал свое мнение, чтобы избавиться от этого FrameLayout, и теперь все работает нормально. Я не знаю точно, почему это произошло и почему это произошло только на Киткате, но я думаю, что это связано с измерением размеров. Надеюсь, это поможет.

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