GridView с двумя столбцами, первый элемент охватывает обе колонки

У меня есть один Imageview и один gridview.

Мой дизайн макета здесь ..

Введите описание изображения здесь

Я хочу объединить эти два вида в одно gridview

мой вопрос:

Как установить начальные позиции элемента gridview в обоих столбцах?

Solutions Collecting From Web of "GridView с двумя столбцами, первый элемент охватывает обе колонки"

Изучая ваш вопрос, я узнал что-то новое: мне довелось посмотреть GridLayoutManager для RecyclerView и я заметил, что вы можете установить собственный SpanSizeLookup . Теперь «span» – это просто столбец, если вы прокручиваете по вертикали и строку, если вы прокручиваете по горизонтали. Таким образом, SpanSizeLookup позволяет указать, например, item 0 принимает 2 столбца, элемент 1 принимает 1 столбец и т. Д.

Оказывается, если вы используете RecyclerView с GridLayoutManager это решение легко:

  @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Create a grid layout with two columns GridLayoutManager layoutManager = new GridLayoutManager(this, 2); // Create a custom SpanSizeLookup where the first item spans both columns layoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { @Override public int getSpanSize(int position) { return position == 0 ? 2 : 1; } }); RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerview); recyclerView.setLayoutManager(layoutManager); recyclerView.setAdapter(new MyGridAdapter()); } 

Я создал тестовый проект, чтобы попробовать его и убедиться, что он сделал то, что я ожидал, и он работал как шарм.


Примечание об адаптере: RecyclerView.Adapter несовместим с ListAdapter . Вам необходимо расширить адаптер от RecyclerView.Adapter и внести соответствующие изменения.

Вот адаптер, который я создал для моего тестового проекта:

  public static class MyViewHolder extends RecyclerView.ViewHolder { ImageView mImageView; TextView mTextView; public MyViewHolder(View itemView) { super(itemView); mImageView = (ImageView) itemView.findViewById(R.id.imageView); mTextView = (TextView) itemView.findViewById(R.id.textView); } } public static class MyGridAdapter extends RecyclerView.Adapter<MyViewHolder> { private int[] mDrawables; public MyGridAdapter() { this.mDrawables = new int[] { R.drawable.images_01, R.drawable.images_02, . . . }; } @Override public int getItemCount() { return mDrawables.length; } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { LayoutInflater inflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); View view = inflater.inflate(R.layout.layout_grid_item, parent, false); MyViewHolder holder = new MyViewHolder(view); // set up any onClickListener you need on the view here return holder; } @Override public void onBindViewHolder(MyViewHolder holder, int position) { holder.mImageView.setImageResource(mDrawables[position]); holder.mTextView.setText("Image " + position); } } 

Сначала создайте подкласс RecyclerView.ViewHolder . Шаблон держателя вида теперь является неотъемлемой частью этого нового способа просмотра адаптеров. Ваш ViewHolder настроит все дочерние представления для вашего представления.

Затем в подклассе RecyclerView.Adapter переопределите onCreateViewHolder() и onBindViewHolder() . В onCreateViewHolder() вы onCreateViewHolder() свое представление и ViewHolder . В onBindViewHolder() вы используете position для получения данных адаптера и настройки дочерних представлений с помощью ViewHolder . Поэтому RecyclerView технически перерабатывает ViewHolder s, которые содержат View s.

После внесения этих изменений в ваш адаптер, вы должны быть настроены.