Nella ricerca della tua domanda, ho imparato qualcosa di nuovo: mi è capitato di guardare GridLayoutManager
per RecyclerView
e ho notato che è possibile impostare un numero personalizzato SpanSizeLookup
. Ora uno "span" è solo una colonna se stai scorrendo verticalmente e una riga se stai scorrendo orizzontalmente. Così il SpanSizeLookup
consente di specificare per esempio, collo 0 prende 2 colonne, punto 1 prende 1 colonna, ecc
Si scopre che se si utilizza RecyclerView
con una GridLayoutManager
la soluzione è facile-peasy:
@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());
}
Ho creato un progetto di prova solo per provarlo e assicurarsi che abbia fatto quello che mi aspettavo, e ha funzionato come un fascino.
Una nota riguardo l'adattatore: RecyclerView.Adapter
non è compatibile con ListAdapter
. È necessario estendere l'adattatore da RecyclerView.Adapter
e apportare le modifiche appropriate.
Ecco l'adattatore che ho creato per il mio progetto di test:
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);
}
}
In primo luogo, creare una sottoclasse RecyclerView.ViewHolder
. Il pattern del view view è ora parte integrante di questo nuovo modo di fare le viste dell'adattatore. Il tuo ViewHolder
imposterà tutte le viste secondarie per la tua vista.
Quindi nella sottoclasse RecyclerView.Adapter
, ignorare onCreateViewHolder()
e onBindViewHolder()
. In onCreateViewHolder()
si gonfia la vista e si costruisce il ViewHolder
. In onBindViewHolder()
, si utilizza position
per ottenere i dati dell'adattatore e impostare le viste secondarie utilizzando ViewHolder
. Quindi RecyclerView
ricicla tecnicamente ViewHolder
s che contengono View
s.
Una volta apportate le modifiche all'adattatore, si dovrebbe essere tutto pronto.
Cosa hai provato? – mdelolmo
Ho aggiunto una risposta. Vorrei suggerire di modificare il titolo e il contenuto della domanda, in modo che altre persone che stanno cercando questa soluzione possano trovarla. Forse qualcosa del tipo: "GridView con due colonne, il primo elemento si estende su entrambe le colonne". –