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?

Igor Filippov
sumber
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;
                }
            }
        });
Igor Filippov
sumber
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;
                }
    }
});
Pengembang Android
sumber
2

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

Karpet Mahamune
sumber