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.