RecyclerView pas de recyclage des points de vue si le nombre de vues est petit

J'ai eu affaire à un comportement étrange dans Recycleur de Vue, si le nombre de vues de la carte est petite, dans mon cas, avec une taille 5, les points de vue ne sont pas recyclés et onBindViewHolder n'est pas appelé lors de l'affichage défile en arrière à l'écran. Si j'augmente la taille de 10 vues par exemple, le recyclage commence à travailler et onBindViewHolder est appelée à chaque fois qu'un affichage entre l'écran.

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>

Recycleur de vue de l'initialisation

    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);

L'Adaptateur

@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);


}

Dans l'écran il y a seulement 3 vues visibles, avec une taille de 5, quand je scroll vers le bas, je peux voir que le createViewHolder et bindViewHolder est appelé à la position 4 et 5, mais quand je scroll à haut ils ne sont pas recyclés lors de la sortie de l'écran. Je peux confirmer que parce que en substituant

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

aucun message n'est enregistré. Toutefois, si le nombre de vues est d'augmenter par exemple avec une taille de 10, tout fonctionne bien, les points de vue sont recyclés et le onBindViewHolder est appelée pour chaque position.

Est-ce un comportement normal ? Si c'est comment puis-je enregistrer l'état d'un point de vue, par exemple état activé, je l'ai utilisé pour enregistrer la position active dans une variable et ensuite utilisé cette ligne pour activer la vue quand il pénètre dans l'écran à l'aide de la méthode bind

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

OriginalL'auteur Sergio Serra | 2015-09-03