Setel rentang untuk item di GridLayoutManager menggunakan SpanSizeLookup


91

Saya ingin menerapkan tata letak seperti kisi dengan header bagian. Pikirkan https://github.com/TonicArtos/StickyGridHeaders

Apa yang saya lakukan sekarang:

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

Sekarang item reguler dan header memiliki ukuran rentang 1. Bagaimana cara mengatasinya?


implementasi ini terlihat benar bagi saya. Apakah Anda men-debug jika Anda mAdapter.getItemViewType(position)mengembalikan nilai yang benar?
— yigit

1
"1" sepertinya nilai default yang lebih aman daripada "-1".
— BladeCoder

Saya seorang pemula. Bagi saya, tautan ini membantu saya 3 Contoh Gulir Tak Terbatas RecyclerView
— Vijay Ram

Jawaban:


160

Masalahnya adalah header harus memiliki ukuran span 2, dan item biasa harus memiliki ukuran span 1. Jadi implementasi yang benar adalah:

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

14
get span size method menentukan jumlah lebar bentang sel Anda akan mengambil bukan jumlah baris kolom yang harus dimiliki !!
— Karthik Rk

1
saat mencakup item pertama, itu mengacaukan tinggi item berikutnya. Ini berfungsi pada item lain. Ada ide ?
— Ronny Shibley

1
@RonnyShibley solusi apa pun untuk masalah yang Anda sebutkan di atas ... Saya juga menghadapi masalah yang sama, item pertama setelah tajuk tidak muncul, yang lain semua ditampilkan sesuai kebutuhan
— Umair

Ini tidak terbangun.
— Mahdi

34

Header harus memiliki rentang yang sama dengan jumlah rentang seluruh daftar.

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

2

Jawaban untuk pertanyaan saya sendiri: Ganti getSpanSizeLookup () dari Aktivitas setelah menyetel adaptor.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.