Ответ 1
Надеюсь, это не строгое требование для вас, что вы используете GridView
, поскольку я считаю, что то, что вы ищете, по существу невозможно. Однако, если вы захотите использовать RecyclerView
вместо этого, у меня есть решение для вас.
В этом решении будет использоваться FlexboxLayoutManager
, часть проекта FlexboxLayout Google https://github.com/google/flexbox-layout
Полный код для моего решения можно увидеть здесь: https://gist.github.com/zizibaloob/0c44bfe59b371b5ae0bd2edcb4a7e592
Я расскажу о важных битках здесь. Во-первых, установка FlexboxLayoutManager
в MainActivity.onCreate()
:
FlexboxLayoutManager manager = new FlexboxLayoutManager(this, FlexDirection.ROW);
manager.setJustifyContent(JustifyContent.CENTER);
RecyclerView recycler = (RecyclerView) findViewById(R.id.recycler);
recycler.setLayoutManager(manager);
Когда мы создаем диспетчер компоновки, мы передаем FlexDirection.ROW
, чтобы сообщить нам, что мы хотим, чтобы наши объекты выходили горизонтально (т.е. заполняем строку, а затем переходим к следующей строке, а не заполняем столбец, а затем течет к следующему столбцу).
Затем мы вызываем setJustifyContent()
с помощью JustifyContent.CENTER
, чтобы сообщить менеджеру, что мы хотим, чтобы частично заполненные строки были центрированы.
Второй важный бит - это способ, которым мы имитируем поведение GridView
и его способность иметь заданное количество столбцов. Этот код находится в MyAdapter.onCreateViewHolder()
:
ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) itemView.getLayoutParams();
layoutParams.width = (parent.getWidth() / 4) - layoutParams.leftMargin - layoutParams.rightMargin;
itemView.setLayoutParams(layoutParams);
Ключ здесь (parent.getWidth() / 4)
, который дает каждому элементу вид одной четверти доступной ширины. Если вам нужно другое количество столбцов, просто измените 4
на 8
и т.д.
Мы также вычитаем leftMargin
и rightMargin
из ширины, потому что наши представления элементов имеют разметку, и нам нужно оставить для них пространство. Если ваши представления не будут иметь полей, вы можете пропустить это.
Поместите все это вместе, и вы получите приложение, которое выглядит так: