web-dev-qa-db-fra.com

Est-ce que notifydatasetchanged appelle onCreateViewHolder lors de l'utilisation de RecyclerView

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?

19
AmaJayJB

J'avais besoin de deux types sur Views sur ma RecyclerViewAdapter é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.

20
marmor

notifyDataSetChanged() appelle onBindViewHolder() en cas de RecyclerView

8

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

2
streamride

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" :)

0
Mujtaba Mahmood

Oui, il supposera que son ensemble de données actuel est invalide et devrait relayer et relier toutes les présentations.

0
Kevin Crain