2014-11-10 8 views
10

Sto sviluppando un app Android che avrà una schermata simile alla seguente immagine - enter image description hereCome mostrare banner pubblicitari in modo intermittente in GridView

Si prega di notare il banner tra le cellule. Dato che GridView non supporta questo tipo di colonne, non sono in grado di sapere cosa fare.

Si prega di fornire qualsiasi suggerimento possibile. Grazie in anticipo.

risposta

3

È necessario creare due layout per gli elementi in GridView adattatore. Uno per ciò che si desidera mostrare e altro per adView e posizionare alternativamente il layout durante la creazione della vista.

Verificare this per avere più idea.

+0

non sarà presente solo mostra in una cella anziché tratto da lato a lato come nell'immagine sopra? – Pankaj

+0

puoi chiarire di più. Adview è possibile impostare la larghezza e l'altezza – virendrao

+0

se si guarda l'immagine si vedrà una barra intitolata immagine. Questo è ciò di cui sto parlando. Come faccio a mostrare quell'annuncio tra gli annunci normali. – Pankaj

3

Bene, penso di poterti fornire esempi di codice ... Prima di tutto, ho aggiunto AsymmetricGridView.

compile 'com.felipecsl.asymmetricgridview:library:2.0.1' 

Io uso this guide. Si è scoperto su un tale adattatore aggiunta:

ListAdapter ia = new PreviewsAdapter(mContext, currentPreviews).setAdsWidth(numRows); 

    gridListView.setRequestedColumnWidth(Utils.dpToPx(mContext, 80)); 

    gridListView.setAllowReordering(true); 
    AsymmetricGridViewAdapter asymmetricAdapter = 
      new AsymmetricGridViewAdapter<>(mContext, gridListView, ia); 

    gridListView.setAdapter(asymmetricAdapter); 
    gridListView.setOnItemClickListener(gridviewOnItemClickListener); 

Prestare attenzione alla numRows. Prima di aggiungere una vista fisica non sappiamo quanto avremo colonne. E non possiamo sapere quante celle (ampie) pubblicizzano. È possibile che tu sia in grado di utilizzare il metodo standard AsymmetricGridView.

Ho dovuto usare questo codice terribile ( In esso intasato le mie costanti.

Display display = mContext.getWindowManager().getDefaultDisplay(); 
    Point size = new Point(); 

    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2){ 
     display.getSize(size); 
    } else { 
     size.set(display.getWidth(), display.getHeight()); 
    } 

    final int mSize; 
    if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { 
     mSize = Math.min(size.x, size.y); 
    } else if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { 
     mSize = Math.max(size.x, size.y) - Math.min(size.x, size.y); 
    } else { 
     mSize = Math.min(size.x, size.y); 
    } 

    int numRows = Math.round((float) mSize/(float) Utils.dpToPx(mContext, 100)); 
// 80 width cell item + 20 padding 

Tutta la magia l'adattatore PreviewsAdapter estende BaseAdapter

Determinare dove non è la pubblicità. Voglio in the middle

adsId = currentPreviews.size()/2; 

Forgia un numero di voci. Le nostre voci nums + annuncio

public int getCount() { 
    return currentPreviews.size() + 1; 
} 

Ora restituiremo l'oggetto. Sono nostri membri o pubblicità.

public Object getItem(int position) { 
    if(adsId != position) { 
     if(position >= adsId) { 
      position-=1; 
     } 
     return currentPreviews.get(position); 
    } else { 
     return new AdsItem(this.numRows, 1); 
    } 
} 

Il nostro oggetto deve implementare AsymmetricItem. Pubblicità, anche. Ecco un esempio della pubblicità delle classi di oggetti.

public class AdsItem implements AsymmetricItem { 

    private final int width; 
    private final int height; 


    public AdsItem(int adsWidth, int adsHeight) { 
     width = adsWidth; 
     height = adsHeight; 
    } 

    @Override 
    public int getColumnSpan() { 
     return width; 
    } 

    @Override 
    public int getRowSpan() { 
     return height; 
    } 

    @Override 
    public int describeContents() { 
     return 0; 
    } 

    @Override 
    public void writeToParcel(Parcel parcel, int i) { 

    } 
} 

getRowSpan, getColumnSpan determinare la larghezza e l'altezza dell'oggetto Visualizza nelle celle.

E qui è il metodo per ottenere Vista:

public View getView(int position, View convertView, ViewGroup parent) { 
     if(adsId != position) { 
      ImageView imageView; 
      if (convertView == null) { 
       imageView = new SquareImageView(mContext); 
       imageView.setLayoutParams(new GridView.LayoutParams(GridView.LayoutParams.MATCH_PARENT, GridView.LayoutParams.MATCH_PARENT)); 
       imageView.setPadding(10, 10, 10, 10); 
      } else { 
       imageView = (SquareImageView) convertView; 
      } 

      AvatarPart ap = (AvatarPart) getItem(position); 

      Bitmap b = imgs.get(ap.getFile()); 
      imageView.setImageBitmap(b); 
      imageView.invalidate(); 
      return imageView; 
     } else { 
      String adId = mContext.getResources().getString(R.string.add_id); 

      AdView mAdView = new AdView(mContext); 
      mAdView.setPadding(0, 15, 0, 15); 
      mAdView.setAdSize(AdSize.BANNER); 
      mAdView.setAdUnitId(adId); 
      AdRequest adRequest = new AdRequest.Builder() 
        .build(); 
      if(mAdView.getAdSize() != null) 
       mAdView.loadAd(adRequest); 

      return mAdView; 
     } 
    } 

Ma io non sono sicuro di questa linea:

imageView = (SquareImageView) convertView; 

Io non so se ci si arriva AdView. Ma mentre non è rotto: D

Per gestire i clic dovevano scrivere un altro metodo.

public AvatarPart getItemWithoutAds(int position) { 
    if(position == adsId) return null; 
    if(position >= adsId) { 
    position-=1; 
} 
    return currentPreviews.get(position); 
} 

Questo non è certamente il codice più bello, ma funziona. Risultato: enter image description here

2

A mio parere, il modo migliore per farlo è utilizzare RecyclerView con GridLayoutManager. Fornisci semplicemente SpanSizeLookup per GridLayoutManager che può determinare le dimensioni di ciascuna posizione. Ad esempio, prima posizione bisogno di ocupate pieno fila

//Two items in a row 
int spanCount = 2; 
GridLayoutManager manager = new GridLayoutManager(getActivity(),spanCount); 
manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { 
      @Override 
      public int getSpanSize(int position) { 
       return (position == 0 ? spanCount : 1); 
      } 
     }); 

Nella scheda di fornire 2 tipi di elementi - solita voce e la pubblicità voce

È preferibile impostare imbottiture articolo tramite ItemDecoration.

posso fornire più codice, se necessario

Problemi correlati