Je souhaite utiliser une bascule pour basculer entre deux vues différentes, mais en utilisant la même RecyclerView
. En gros, une fois que vous avez basculé, je veux que l’adaptateur RecyclerView
rappelle onCreateViewHolder()
, mais cette fois-ci, il utilisera un fichier d’élément de présentation différent.
notifydatasetchanged()
provoque-t-il la reconstruction de l'adaptateur? Ou y a-t-il un autre moyen?
J'avais besoin de deux types sur View
s sur ma RecyclerView
Adapter
également, un pour le mode "normal" et un pour le mode de sélection multiple.
Ainsi, vous pouvez remplacer getItemViewType
pour forcer l'adaptateur à appeler votre onCreateViewHolder
pour toutes les vues.
Ajoutez ceci au code Adapter
:
public void setActionMode(ActionMode actionMode) {
this.actionMode = actionMode;
notifyDataSetChanged();
}
@Override
public int getItemViewType(int position) {
return (actionMode == null ? 0 : 1);
}
Ajoutez ceci à la ViewHolder
:
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view;
if (viewType == 0) {
view = inflater.inflate(R.layout.layout_1, parent, false);
} else {
view = inflater.inflate(R.layout.layout_2, parent, false);
}
...
}
Dans la mesure où vous renvoyez une variable ViewType
différente dans une variable ActionMode
, l'adaptateur est obligé de supprimer toutes les vues créées et de tout recréer.
notifyDataSetChanged()
appelle onBindViewHolder()
en cas de RecyclerView
Pour supprimer et mettre à jour la présentation dans RecyclerView
, vous pouvez appeler
mRecyclerView.removeView(view);
OU
mRecyclerView.removeViewAt(position);
après avoir retiré un objet de votre jeu de données
J'ai passé plus de 6 heures sur cette question sans aucun succès . Enfin !!! !!!. J'ai défini une variable globale dans l'adaptateur et je devais la configurer chaque fois que je basculais la vue d'une liste à une autre (dans ma liste déroulante). Cas). la chose amusante cette approche était là mais j'ai oublié de le faire comme statique !! Donc, ma solution pourrait être liée à la vôtre, essayez-la et espérez que cela fonctionne.
public static int mCurrentViewType;
puis écrasez getItemType ()
@Override
public int getItemViewType(int position) {
return mCurrentViewType;
}
ma méthode toggleItemViewType:
public void toggleItemViewType () {
if (mCurrentViewType == LIST_ITEM){
mCurrentViewType = GRID_ITEM;
} else {
mCurrentViewType = LIST_ITEM;
}
}
J'accède à la variable à partir de différentes classes, ce qui n'est pas correct, mais pour l'instant et pour le problème de onCreateViewHolder, cela a fonctionné! Si vous avez une meilleure solution, alors bonne chance et partagez-la avec nous . n'oubliez pas de rendre la variable globale sous la forme "statique" :)
Oui, il supposera que son ensemble de données actuel est invalide et devrait relayer et relier toutes les présentations.