Đặt khoảng cách cho các mục trong GridLayoutManager bằng SpanSizeLookup


90

Tôi muốn triển khai bố cục dạng lưới với tiêu đề phần. Hãy nghĩ đến https://github.com/TonicArtos/StickyGridHeaders

Những gì tôi làm bây giờ:

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

Bây giờ cả các mục thông thường và tiêu đề đều có kích thước khoảng là 1. Làm cách nào để giải quyết vấn đề này?


triển khai này có vẻ đúng với tôi. Bạn đã gỡ lỗi nếu của bạn mAdapter.getItemViewType(position)đang trả về giá trị chính xác?
yigit

1
"1" có vẻ như là một giá trị mặc định an toàn hơn "-1".
BladeCoder

Tôi là một người mới. Đối với tôi, liên kết này đã giúp tôi 3 Ví dụ về RecyclerView Infinite Scroll
Vijay Ram,

Câu trả lời:


158

Vấn đề là tiêu đề phải có kích thước nhịp là 2 và mục thông thường phải có kích thước nhịp là 1. Vì vậy, triển khai đúng là:

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

13
phương thức get span size xác định số lượng chiều rộng span mà ô của bạn sẽ nhận chứ không phải số hàng col nên có !!
Karthik Rk

1
khi kéo dài mục đầu tiên, nó sẽ làm rối chiều cao của các mục tiếp theo. Nó hoạt động trên bất kỳ mục nào khác. Bất kỳ ý tưởng ?
Ronny Shibley

1
@RonnyShibley bất kỳ giải pháp cho vấn đề bạn nêu ở trên ... Tôi cũng phải đối mặt với cùng một vấn đề, mục đầu tiên sau khi phần đầu không cho thấy, những người khác đều thể hiện lên theo yêu cầu
Umair

Đây không phải là woking.
Mahdi

34

Tiêu đề phải có một khoảng bằng với số nhịp của toàn bộ danh sách.

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

Trả lời cho câu hỏi của riêng tôi: Ghi đè getSpanSizeLookup () khỏi Activity sau khi thiết lập bộ điều hợp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.