web-dev-qa-db-fra.com

Définir l'étendue des éléments dans GridLayoutManager à l'aide de SpanSizeLookup

Je souhaite implémenter une présentation de type grille avec des en-têtes de section. Pensez à https://github.com/TonicArtos/StickyGridHeaders

Ce que je fais maintenant:

mRecyclerView = (RecyclerView) view.findViewById(R.id.grid);
mLayoutManager = new GridLayoutManager(getActivity(), 2);
mLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
            @Override
            public int getSpanSize(int position) {
                switch(mAdapter.getItemViewType(position)){
                    case MyAdapter.TYPE_HEADER:
                        return 1;
                    case MyAdapter.TYPE_ITEM:
                        return 2;
                    default:
                        return -1;
                }
            }
        });

mRecyclerView.setLayoutManager(mLayoutManager);

Maintenant, les éléments normaux et les en-têtes ont une taille d'envergure de 1. Comment résoudre ce problème?

83
Igor Filippov

Le problème était que l'en-tête devait avoir une taille d'envergure de 2 et que l'élément normal devait en avoir une de 1. La mise en œuvre correcte est la suivante:

mLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
            @Override
            public int getSpanSize(int position) {
                switch(mAdapter.getItemViewType(position)){
                    case MyAdapter.TYPE_HEADER:
                        return 2;
                    case MyAdapter.TYPE_ITEM:
                        return 1;
                    default:
                        return -1;
                }
            }
        });
142
Igor Filippov

L'en-tête doit avoir une étendue égale au nombre d'étapes de la liste entière.

mLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
    @Override
    public int getSpanSize(int position) {
           switch(mAdapter.getItemViewType(position)){
                    case MyAdapter.TYPE_HEADER:
                        return mLayoutManager.getSpanCount();
                    case MyAdapter.TYPE_ITEM:
                        return 1;
                    default:
                        return -1;
                }
    }
});
28
Android Developer

Réponse à ma propre question: Remplacez getSpanSizeLookup () à partir de l'activité après avoir défini l'adaptateur.

2
Rugved Mahamune