android - example - GridView con dos columnas, el primer elemento abarca ambas columnas
gridview dinamico android (1)
Al investigar su pregunta, aprendí algo nuevo: me GridLayoutManager
con GridLayoutManager
para RecyclerView
y noté que puede establecer un SpanSizeLookup
personalizado. Ahora, un "intervalo" es solo una columna si está desplazándose verticalmente y una fila si está desplazándose horizontalmente. Por lo tanto, SpanSizeLookup
permite especificar, por ejemplo, el artículo 0 toma 2 columnas, el artículo 1 toma 1 columna, etc.
Resulta que si utiliza RecyclerView
con un GridLayoutManager
la solución es fácil:
@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());
}
Creé un proyecto de prueba solo para probarlo y asegurarme de que hiciera lo que esperaba, y funcionó a la perfección.
Una nota sobre el adaptador: RecyclerView.Adapter
no es compatible con ListAdapter
. Necesita extender su adaptador desde RecyclerView.Adapter
y hacer los cambios apropiados.
Aquí está el adaptador que creé para mi proyecto de prueba:
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);
}
}
Primero, crea una subclase RecyclerView.ViewHolder
. El patrón del soporte de vista ahora es una parte integral de esta nueva forma de hacer vistas de adaptador. Su ViewHolder
configurará todas las vistas secundarias para su vista.
Luego, en su subclase RecyclerView.Adapter
, onCreateViewHolder()
y onBindViewHolder()
. En onCreateViewHolder()
infla su vista y construye ViewHolder
. En onBindViewHolder()
, utiliza la position
para obtener los datos del adaptador y configurar las vistas secundarias mediante ViewHolder
. Por lo tanto, RecyclerView
técnicamente recicla ViewHolder
s que contienen View
s.
Una vez que realices esos cambios en tu adaptador, deberías estar listo.
Tengo una vista de imagen y una vista de cuadrícula ..
Mi diseño de diseño aquí ..
Quiero combinar estas dos vistas en una sola vista de cuadrícula
mi pregunta:
¿Cómo configurar el primer elemento de gridview en ambas columnas?