RecyclerView не перерабатывает представления, если количество просмотров невелико

Я занимаюсь странным поведением в Recycler View, если количество просмотров в адаптере невелико, в моем случае с размером 5, представления не перерабатываются, а onBindViewHolder не вызывается, когда представление прокручивается обратно на экран. Если я, например, увеличиваю размер до 10 видов, то начинается рециркуляция, и onBindViewHolder вызывается каждый раз, когда представление входит в экран.

XML

<android.support.v4.widget.SwipeRefreshLayout android:id="@+id/swipeRefresh" android:layout_width="wrap_content" android:layout_height="wrap_content"> <!-- RECYCLER VIEW --> <android.support.v7.widget.RecyclerView android:id="@+id/eventsList" android:layout_width="match_parent" android:layout_height="match_parent" /> </android.support.v4.widget.SwipeRefreshLayout> 

Инициализация просмотра ресайклеров

  LinearLayoutManager llm = new LinearLayoutManager(getActivity()); llm.setOrientation(LinearLayoutManager.VERTICAL); eventsList.setLayoutManager(llm); //Sets endless listener scrollListener = new EndlessRecyclerOnScrollListener(llm,3,mLastDownloadedPage) { @Override public void onLoadMore(int current_page) { Timber.d("Loading date for page: " + current_page); mLastDownloadedPage = current_page; //If it's showing cached don't download if(showingCached) return; //Shows snackbar loading view showSnackbarLoadingView(); //Gets events getEvents(false); } }; //eventsList.addOnScrollListener(scrollListener); //Set the adapter mAdapter = new EventListAdapter(this,getActivity().getApplicationContext()); eventsList.setAdapter(mAdapter); 

Адаптер

 @Override public EventHolder onCreateViewHolder(ViewGroup viewGroup, int i) { Timber.d("Create view holder pos: "+i); View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_events_row, viewGroup, false); return new EventHolder(v,mListener); } @Override public void onBindViewHolder(EventHolder eventHolder, int i) { if(mBindListener != null) mBindListener.onBind(eventHolder,i); Timber.d("Bind view holder pos "+i); Event event = eventList.get(i); eventHolder.bindEvent(event); //Sets the date setDate(eventHolder.date, event); //Sets the location setLocation(eventHolder.distance,event); } 

На экране есть только 3 видимых вида с размером 5, когда я прокручиваю вниз, я вижу, что createViewHolder и bindViewHolder вызывается для позиции 4 и 5, но когда я прокручиваю вверх, они не перерабатываются при выходе из экрана , Я могу подтвердить это, потому что, переопределяя

 @Override public void onViewRecycled(EventHolder holder) { super.onViewRecycled(holder); Timber.d("onViewRecycled: "+holder.name); } 

Сообщение не регистрируется. Однако, если количество просмотров увеличивается, например, с размером 10, все работает отлично, представления перерабатываются, а onBindViewHolder вызывается для каждой позиции.

Это нормальное поведение? Если я могу сохранить состояние представления элемента, например, активированное состояние, я использовал для сохранения активной позиции в переменной, а затем использовал эту строку для активации представления, когда он входит в экран, используя метод привязки

  holder.itemView.setActivated(pos == lastSelectedPos); 

Это нормальное поведение, но вы можете настроить его с помощью:

 recyclerView.setItemViewCacheSize(int); 

О второй части вопроса – вы правы! Сохраните «активированное» положение в качестве переменной в вашем адаптере. В onBindViewHolder () выполните что-то вроде:

 holder.itemView.setActivated(holder.getAdapterPosition() == lastSelectedPos);