ตั้งค่าช่วงสำหรับรายการใน GridLayoutManager โดยใช้ SpanSizeLookup


93

ฉันต้องการใช้เค้าโครงแบบตารางที่มีส่วนหัวของส่วน ลองนึกถึงhttps://github.com/TonicArtos/StickyGridHeaders

ตอนนี้ฉันทำอะไร:

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

ตอนนี้ทั้งรายการปกติและส่วนหัวมีขนาดช่วง 1 ฉันจะแก้ปัญหานี้ได้อย่างไร?


การใช้งานนี้ดูเหมือนถูกต้องสำหรับฉัน คุณตรวจแก้จุดบกพร่องหรือไม่ว่าคุณmAdapter.getItemViewType(position)ส่งคืนค่าที่ถูกต้องหรือไม่?
yigit

1
"1" ดูเหมือนเป็นค่าเริ่มต้นที่ปลอดภัยกว่า "-1"
BladeCoder

ฉันเป็นมือใหม่ สำหรับฉันลิงก์นี้ช่วยฉันได้3 RecyclerView Infinite Scroll Example
Vijay Ram

คำตอบ:


162

ปัญหาคือส่วนหัวควรมีขนาดช่วงเป็น 2 และรายการปกติควรมีขนาดช่วง 1 ดังนั้นการใช้งานที่ถูกต้องคือ:

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

15
วิธี get span size กำหนดจำนวนช่วงความกว้างที่เซลล์ของคุณจะใช้ไม่ใช่จำนวน col row ที่ควรมี !!
Karthik Rk

1
เมื่อทอดรายการแรกจะทำให้ความสูงของรายการถัดไปยุ่งเหยิง ใช้งานได้กับรายการอื่น ๆ ความคิดใด ๆ ?
Ronny Shibley

1
@RonnyShibley วิธีแก้ปัญหาที่คุณระบุไว้ข้างต้น ... ฉันกำลังประสบปัญหาเดียวกันรายการแรกหลังจากที่ส่วนหัวไม่แสดงขึ้นส่วนอื่น ๆ จะแสดงทั้งหมดตามต้องการ
Umair

นี่ไม่ใช่การว้าก
Mahdi

37

ส่วนหัวควรมีช่วงเท่ากับจำนวนช่วงของรายการทั้งหมด

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.