Évolution du nombre de colonnes avec GridLayoutManager et RecyclerView
À l'intérieur de mon fragment je suis mon GridLayout de la façon suivante:
mRecycler.setLayoutManager(new GridLayoutManager(rootView.getContext(), 2));
Donc, je veux juste changer que 2
pour un 4
lorsque l'utilisateur fait pivoter le téléphone/tablette. J'ai lu sur onConfigurationChanged
et j'ai essayé de le faire fonctionner pour mon cas, mais il ne va pas dans le droit chemin. Quand je tourne mon téléphone, l'application se bloque...
Pourriez-vous me dire comment résoudre ce problème?
Voici ma démarche pour trouver la solution, qui ne fonctionne pas correctement:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
int orientation = newConfig.orientation;
if (orientation == Configuration.ORIENTATION_PORTRAIT) {
mRecycler.setLayoutManager(new GridLayoutManager(mContext, 2));
} else if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
mRecycler.setLayoutManager(new GridLayoutManager(mContext, 4));
}
}
Merci d'avance!
- s'il vous plaît ajouter de crash
- Je viens de prendre un coup d'oeil à mon logcat et ce n'était pas l'origine du crash. Mais il ne fonctionne toujours pas.
- Je ne voudrais pas créer un nouveau manager, mais au lieu d'utiliser l'existant. Utilisation getLayoutManager() sur votre recyclerview, jette à GridLayoutManager. Sur que gestionnaire d'appel setSpanCount(orientation == portrait ? 2 : 4) Et pour le bien de redessiner l'avis d'appel adaper.notifyDatasetChanged (), Cela devrait fonctionner correctement si votre vue n'est pas redessiné à chaque fois.
- WOW! C'est du son comme je cherchais, mais je n'ai pas su comment l'atteindre. Je vais essayer de vous parler.
- Notez qu'il est toujours une bonne idée de vérifier l'orientation lors de la création de la vue elle-même. Que vous faites habituellement dans onCreate, pour des Activités ou onCreateView pour des fragments. Assurez-vous que vous le faites parce que vos utilisateurs peuvent démarrer l'activité en mode paysage
- Ne fonctionnait pas, je pense que c'est à cause de la vue d'être redessiné.
- Oui. La vue par défaut est corrigé lorsque vous cange l'orientation, alors assurez-vous que vous la gérer il.
- Votre question a très bien fonctionné pour moi, je ne sais pas pourquoi le vôtre a été s'écraser. Avez-vous jamais comprendre pourquoi?
- Regarde @SobaDeveloper. J'ai changé le de mon onResume() pour mon onCreateView()
- En gros, j'ai mis en œuvre à la fois de vos réponses. Je suis surpris que cela n'a pas obtenu plus d'attention. Je vois beaucoup de demandes de ce faire.
Vous devez vous connecter pour publier un commentaire.
Essayer de la manipulation de ce à l'intérieur de votre onCreateView méthode plutôt car elle sera appelée à chaque fois qu'il y a un changement d'orientation:
getConfiguration()
ouonConfigurationChanged
. Voir aussi ma réponse à cette question.Si vous avez plus d'un état ou d'utilisation de la valeur dans de multiples endroits ce qui peut sortir de la main assez rapide. Je suggère de créer la structure suivante:
avec
res/values/dimens.xml
être:et
res/values-land/dimens.xml
être:Et le code devient alors (et toujours séjours) comme ceci:
Vous pouvez facilement voir combien il est facile d'ajouter de nouvelles façons de déterminer le nombre de colonnes, par exemple à l'aide de
-w500dp
/-w600dp
/-w700dp
dossiers de ressources au lieu de-land
.Il est également très facile de grouper ces dossiers distincts dossier de ressources dans le cas où vous ne souhaitez pas encombrer votre autre (plus pertinent) ressources:
Le contenu de la Vue prend en charge AutofitRecycleView.
Vous devez ajouter
android:numColumns="auto_fit"
dans votre fichier xml.Vous pouvez vous référer à ce AutofitRecycleViewLink
Une façon plus robuste pour déterminer le pas. des colonnes consisterait à calculer sur la base de la largeur de l'écran et lors de l'exécution. J'ai l'habitude d'utiliser la fonction suivante pour que.
C'est une méthode dynamique pour calculer avec précision le pas. des colonnes. Ce sera plus souple pour les utilisateurs de différentes tailles d'écran sans être réglementé à seulement deux valeurs possibles.
NB: Vous pouvez faire varier la valeur détenue par le scalingFactor variable. La plus petite, il est le plus pas de. de colonnes, vous pouvez afficher, et la plus grande de la valeur de la pas moins. des colonnes sera calculée. Il est le facteur d'échelle pour l'ajuster à vos besoins.
Dans le onCreate () de l'événement, vous pouvez utiliser StaggeredGridLayoutManager
Ensuite, lorsque l'utilisateur fait pivoter l'écran de capture de l'événement, et de modifier le nombre de colonnes automatiquement
J'ai fini la manipulation de ce dans la méthode onCreate.
Cela a fonctionné parfaitement pour mon application.
Vous pouvez mettre en œuvre la méthode dans votre recyclerView onMeasure.
Tout d'abord, créez la classe java AutofitRecyclerView
Dans votre xlm fichier de mise en page activity_main.xml
Puis définissez la variable de la largeur de chaque élément dans la taille de fichier des valeurs de dossier values/dimens.xml
Il peut l'être pour différentes résolutions d'écran values-xxhdpi/dimens.xml
Dans votre activité à l'événement onCreate de placer le code suivant