4
votes

La modification de la disposition d'un RecyclerView lors d'un changement d'orientation ne fonctionne que sur la première vue

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));


2 commentaires

Cas de test, essayez de redéfinir l'adaptateur sur RecyclerView dans votre méthode changeFeedsLayout ()


@NileshRathod ne fonctionne pas correctement


3 Réponses :


0
votes

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.


0 commentaires

3
votes

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

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());
}

l'autre sera values-sw520dp / bools.xml :

<resources>
    <integer name="grid_column_count">3</integer>
</resources>

Pour le nombre de colonnes, même logique values-sw520dp/integers.xml^:

<resources>
    <integer name="grid_column_count">2</integer>
</resources>

Et valeurs -sw720dp / integers.xml :

<resources>
    <bool name="is_grid">true</bool>
</resources>

Donc, dans le code, ce sera quelque chose comme:

<resources>
    <bool name="is_grid">false</bool>
</resources>

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.


1 commentaires

+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.)



1
votes

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).


2 commentaires

votre moyenne est au lieu de LinearLayoutManager Je devrais utiliser GridLayoutManager tel que instagram_feeds.setLayoutManager (new GridLayoutManager (context, 3, LinearLayoutManager.VERTICAL, false) ?


@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.