Dans mon application, j'ai ce code pour calculer la taille du téléphone et changer le gestionnaire de disposition de RecyclerView
en GridLayoutManager
ou LinearLayoutManager
instagram_feeds.setLayoutManager(new LinearLayoutManager( context, LinearLayoutManager.VERTICAL, false));
3 Réponses :
Pour pouvoir gérer le changement d'orientation et travailler en conséquence, j'ai fait ce qui suit:
I/SCREENÂ DP: Orientation:1 Width = 411.42856 I/SCREENÂ DP: Orientation:2 Width = 683.4286 I/SCREENÂ DP: Orientation:1 Width = 411.42856 I/SCREENÂ DP: Orientation:2 Width = 683.4286
Les journaux montrent:
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); Log.i("SCREEN DP","Orientation:"+ getResources().getConfiguration().orientation +" Width = "+getWidthDp()); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); Log.i("SCREEN DP","Orientation:"+ newConfig.orientation +" Width = "+getWidthDp()); } public float getWidthDp(){ DisplayMetrics displayMetrics = getResources().getDisplayMetrics(); return displayMetrics.widthPixels / displayMetrics.density; } }
N'oubliez pas d'ajouter android: screenOrientation = "fullSensor"
sur le manifeste afin de pouvoir gérer toutes les orientations.
Cela peut sembler étrange, mais la seule solution valable dans ce cas est de mettre ces paramètres dans les ressources. Le système d'exploitation Android récupère les ressources en fonction de nombreuses propriétés et l'une d'entre elles est la plus petite largeur. Pour séparer la liste de la grille:
values/bools.xml l'autre sera values-sw520dp / bools.xml : Pour le nombre de colonnes, même logique values-sw520dp/integers.xml^: Et valeurs -sw720dp / integers.xml : Donc, dans le code, ce sera quelque chose comme: Cela devrait être appliqué chaque fois que vous créez votre vue, pas besoin de gérer le changement de configuration - c'est déjà fait pour vous. Donnez au système d'exploitation faire son travail. if (getResources().getBoolean(R.bool.is_grid)) {
instagram_feeds.setLayoutManager(new GridLayoutManager(getActivity(), getResources().getInteger(R.integer.grid_column_count));
} else {
instagram_feeds.setLayoutManager(new LinearLayoutManager(getActivity());
}
<resources>
<integer name="grid_column_count">3</integer>
</resources>
<resources>
<integer name="grid_column_count">2</integer>
</resources>
<resources>
<bool name="is_grid">true</bool>
</resources>
<resources>
<bool name="is_grid">false</bool>
</resources>
+1. Notez que vous ne devez pas remplacer onConfigurationChanged ()
lorsque vous utilisez cette stratégie. (En fait, vous ne devriez essentiellement jamais remplacer onConfigurationChanged ()
ou utiliser android: configChanges
dans votre manifeste; il est préférable de Viktor dit.)
GridLayoutManager.LayoutParams
sont expliqués dans ses commentaires:
if the orientation is VERTICAL, the width parameter is ignored and if the orientation is HORIZONTAL, the height parameter is ignored because child view is expected to fill all of the space given to it.
le point est:
qu'un LinearLayoutManager code > aura toujours 1 seule colonne;
tandis qu'un GridLayoutManager
"peut" avoir 1 (ou plusieurs) colonne (s).
votre moyenne est au lieu de LinearLayoutManager
Je devrais utiliser GridLayoutManager
tel que instagram_feeds.setLayoutManager (new GridLayoutManager (context, 3, LinearLayoutManager.VERTICAL, false) code >?
@DolDurma utilise GridLayoutManager
et définit 1 colonne, alors vous n'avez pas à changer de gestionnaire de mise en page ... ce qui devrait entraîner un problème moins important.
Cas de test, essayez de redéfinir l'adaptateur sur
RecyclerView
dans votre méthodechangeFeedsLayout ()
@NileshRathod ne fonctionne pas correctement