Переменное количество столбцов в GridLayoutManager

Я хотел отображать переменное количество столбцов в строке GridLayoutManager при использовании RecyclerView. Количество отображаемых столбцов зависит от размера TextView столбца.

Я не знаю ширину столбца, так как текст вставляется в него динамически.

Кто-нибудь может помочь? StaggeredGridLayoutManager не решает мою задачу, поскольку настраивает высоту, но принимает фиксированное количество столбцов.


person sg_dev    schedule 24.09.2015    source источник


Ответы (3)


Взгляните на файл setSpanSizeLookup метода GridLayoutManager. Он позволяет указать размер промежутка для определенных позиций вашего RecyclerView. Так что, возможно, вы могли бы использовать его в соответствии с вашими требованиями к номеру столбца переменной.

Редактировать:

GridLayoutManager manager = new GridLayoutManager(context, 2); // MAX NUMBER OF SPACES
manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
    @Override
    public int getSpanSize(int position) {
        if (position == 1 || position == 6) {
            return 2; // ITEMS AT POSITION 1 AND 6 OCCUPY 2 SPACES
        } else {
            return 1; // OTHER ITEMS OCCUPY ONLY A SINGLE SPACE
        }
    }
});

При использовании такого макета manager ваш RecyclerView должен выглядеть так:

+---+---+
| 0 |   |
+---+---+
|   1   |
+---+---+
| 2 | 3 |
+---+---+
| 4 | 5 |
+---+---+
|   6   |
+---+---+

(только поля с цифрами представляют элементы вашего RecyclerView, остальные поля - просто пустые места)

person Bartek Lipinski    schedule 24.09.2015
comment
Да, я сделал, но не мог понять его реализацию. Можете ли вы опубликовать пример / - person sg_dev; 24.09.2015
comment
Я добавил пример в свой ответ - person Bartek Lipinski; 24.09.2015
comment
очень хорошее объяснение, сэр - person myatmins; 25.01.2017

Если вы хотите сделать вариант, например: 4 столбца, 5 столбцов, 6 столбцов... Вы можете получить MMC (минимальное кратное общее) между этими числами (60) и установить GridLayoutManager:


    GridLayoutManager manager = new GridLayoutManager(context, 60); // set the grid with the MMC
    manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
        @Override
        public int getSpanSize(int position) {
            return 12; // 60/12 = 5 Columns
        }
    });
Затем вы можете вернуть 10, 12 или 15 для 6, 5 и 4 столбцов в getSpanSize()

person Charleston    schedule 11.08.2016

Вы можете использовать диапазон на основе расчета ширины.

     public class AutoFitGridLayoutManager extends GridLayoutManager {
                    private boolean columnWidthChanged = true;
                    Context context;

                    public AutoFitGridLayoutManager(Context context) {
                        super(context, 1);
                        this.context = context;
                        setColumnWidth();
                    }

                    public void setColumnWidth() {
                            columnWidthChanged = true;
                    }

                    @Override
                    public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {
                        if (columnWidthChanged) {
                          
                            //int spanCount = Math.max(1, totalSpace / columnWidth);
                            //setSpanCount(spanCount);
                            setSpanCount(Utils.calculateNoOfColumns(context));
                            columnWidthChanged = false;
                        }
                        super.onLayoutChildren(recycler, state);
                    }
                }

Для расчета столбцов вы можете использовать этот метод:

        public static int calculateNoOfColumns(Context context) {

                DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
                float dpWidth = displayMetrics.widthPixels / displayMetrics.density;
                int scalingFactor = 200; // You can vary the value held by the scalingFactor
                // variable. The smaller it is the more no. of columns you can display, and the
                // larger the value the less no. of columns will be calculated. It is the scaling
                // factor to tweak to your needs.
                int columnCount = (int) (dpWidth / scalingFactor);
                return (columnCount>=2?columnCount:2); // if column no. is less than 2, we still display 2 columns
}
person Abhishek Dwarakanath    schedule 20.10.2020