2015-06-27 12 views
19

ho un'IMAGEVIEW & una GridView ..GridView con due colonne, prima voce si estende entrambe le colonne

mio layout di progettazione qui ..

enter image description here

voglio combinare questi due punti di vista in singola gridView

la mia domanda:

Come impostare gridView primo elemento si estende in entrambe le colonne?

+0

Cosa hai provato? – mdelolmo

+1

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". –

risposta

48

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.

+0

Sostituisco il mio imageview e gridview con recyclerview.after applica il tuo codice .. Ho avuto errore in recyclerView.setAdapter (adattatore); – AndroidDev

+1

Purtroppo, 'RecyclerView.Adapter' non è compatibile con' ListAdapter', quindi dovrai ridisporre un po 'l'adattatore. Aggiornerò la mia risposta per aggiungere qualcosa al riguardo. –

+0

Grazie amico .. Funziona in modo sorprendente..si può condividere come trovare la soluzione? perché cerco più di 10 giorni per questo problema.lot di googling non fornire risposta .. – AndroidDev

Problemi correlati