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
Vous devez vous connecter pour publier un commentaire.
C'est un comportement normal, mais vous pouvez l'ajuster avec:
Sujet de la deuxième partie de la question - vous avez raison! Magasin "activé" la position de la variable dans votre carte. Dans onBindViewHolder() faire quelque chose comme:
Juste une remarque, quand je creuse à l'intérieur de la
recyclerView.setItemViewCacheSize()
, la valeur par défaut pour le cache est 2.Merci kirtan403 j'ai été à la recherche partout pour que.
Épargnant de vie! juste mettre recyclerView.setItemViewCacheSize(-1); et il fonctionne comme un charme!! Je vous remercie beaucoup. Remarque: Lorsque vous définissez recyclerView.setItemViewCacheSize(0); le premier élément m'a fait quelques ennuis donc changé de -1, et il a résolu le problème
OriginalL'auteur JoeyJubb