web-dev-qa-db-fra.com

LinearLayoutManager setReverseLayout () == true, mais les éléments sont empilés du bas

Cela semble être une solution facile, mais il semble que le réglage

private RecyclerView mRecyclerView;
private RecyclerView.Adapter mAdapter;
private LinearLayoutManager mLayoutManager;

.... // More code

    mRecyclerView = (RecyclerView) rootView.findViewById(R.id.recycler_view);

    // Add item decoration
    mRecyclerView.addItemDecoration(new SpacesItemDecoration(DIVIDER_SPACE));

    // use this setting to improve performance if you know that changes
    // in content do not change the layout size of the RecyclerView
    mRecyclerView.setHasFixedSize(true);

    // use a linear layout manager
    mLayoutManager = new LinearLayoutManager(getActivity());
    mLayoutManager.setReverseLayout(true); // THIS ALSO SETS setStackFromBottom to true
    mRecyclerView.setLayoutManager(mLayoutManager);

Semble également définir les éléments à empiler à partir du bas

J'ai essayé de définir setStackFromBottom sur false, mais cela n'a rien fait. Quel serait le meilleur moyen d'inverser l'ordre des éléments tout en remplissant le nombre d'en haut? Devrais-je utiliser une classe de comparaison personnalisée à la place? J'espérais que ce serait un processus plus facile que de créer une autre classe.

38
AndyRoid

à partir de la documentation pour setReverseLayout

Utilisé pour inverser le parcours et l'ordre de présentation des articles. Cela se comporte comme le changement de disposition pour les vues RTL. Lorsqu'il est défini sur true, le premier élément est placé à la fin de l'interface utilisateur, le deuxième élément le précède, etc. Pour les dispositions horizontales, cela dépend du sens de la présentation. Lorsqu'il est défini sur true, si RecyclerView est défini sur LTR, il sera mis en forme à partir de RTL. Si RecyclerView} est défini sur RTL, il sera mis en forme à partir de LTR. Si vous recherchez exactement le même comportement de setStackFromBottom(boolean), utilisez setStackFromEnd(boolean).

Donc, essayez aussi d’utiliser setStackFromEnd (boolean) sur votre instance de LinearLayoutManager,

LinearLayoutManager mLayoutManager = new LinearLayoutManager(getActivity());
mLayoutManager.setReverseLayout(true);
mLayoutManager.setStackFromEnd(true);
105
petey

La réponse acceptée fonctionne bien et j’ai eu du mal à le faire fonctionner car j’obtenais une erreur can not resolve method setReverseLayout

Puis, après avoir cherché des solutions, j’ai trouvé qu’une erreur idiote était commise. J'utilisais RecyclerView.LayoutManager au lieu de LinearLayoutManager

J'ai donc pensé que pour dissiper les confusions autour de moi, je devais le formuler comme réponse. 

N'utilisez pas RecyclerView.LayoutManager au lieu de LinearLayoutManager

// Declare your RecyclerView and the LinearLayoutManager like this 
private RecyclerView mRecyclerView;
private LinearLayoutManager mLayoutManager;

... 

// Now set the properties of the LinearLayoutManager 
mLayoutManager = new LinearLayoutManager(MainActivity.this);
mLayoutManager.setReverseLayout(true);
mLayoutManager.setStackFromEnd(true);

// And now set it to the RecyclerView
mRecyclerView.setLayoutManager(mLayoutManager);
mRecyclerView.setAdapter(yourAdapter);
28
Reaz Murshed

J'ai trouvé la méthode efficace pour résoudre cela en utilisant XML:

app:layoutManager="Android.support.v7.widget.LinearLayoutManager"
app:stackFromEnd="true"
0
Kirk_hehe