У меня есть один Imageview и один gridview.
Мой дизайн макета здесь.
Я хочу объединить эти два вида в одно gridview
мой вопрос:
Как установить промежутки первого элемента gridview в обоих столбцах?
У меня есть один Imageview и один gridview.
Мой дизайн макета здесь.
Я хочу объединить эти два вида в одно gridview
мой вопрос:
Как установить промежутки первого элемента gridview в обоих столбцах?
Изучая ваш вопрос, я узнал что-то новое: мне пришлось посмотреть GridLayoutManager
для RecyclerView
, и я заметил, что вы можете установить пользовательский SpanSizeLookup
. Теперь "span" - это просто столбец, если вы прокручиваете по вертикали и строку, если вы прокручиваете по горизонтали. Таким образом, SpanSizeLookup
позволяет указать, например, элемент 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()
вы раздуваете свой вид и строите ViewHolder
. В onBindViewHolder()
вы используете position
, чтобы получить данные адаптера и настроить дочерние представления с помощью ViewHolder
. Итак, RecyclerView
технически перерабатывает ViewHolder
, которые содержат View
s.
После внесения этих изменений в ваш адаптер, вы должны быть установлены.