2014-11-10 3 views
10

Ich entwickle eine Android-App zeigen, dass ein Bildschirm ähnlich dem folgenden Bild haben wird - enter image description hereWie Banner-Anzeigen mit Unterbrechungen in gridview

Bitte beachten Sie die Banner-Anzeige zwischen den Zellen. Da GridView eine solche Spaltenüberlagerung nicht unterstützt, weiß ich nicht, was zu tun ist.

Bitte geben Sie alle möglichen Vorschläge. Danke im Voraus.

Antwort

3

Sie benötigen zwei Layouts für Elemente im Gridview-Adapter zu erstellen. Eine für das, was Sie anzeigen möchten und andere für adView und das Layout beim Erstellen der Ansicht abwechselnd platzieren.

Überprüfen Sie this, um mehr Idee zu bekommen.

+0

nicht die einzige Show in einer Zelle anstatten Strecke von der Seite wie im Bild oben zu Seite? – Pankaj

+0

können Sie mehr klären. Adview können Sie Breite und Höhe einstellen – virendrao

+0

Wenn Sie das Bild betrachten, sehen Sie ein Bild mit dem Titel slash. Davon rede ich. Wie zeige ich diese Anzeige zwischen den normalen Anzeigen an? – Pankaj

3

Nun, ich denke, ich kann Ihnen Beispiele für Code geben ... Zuerst habe ich AsymmetricGridView hinzugefügt.

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

Ich verwende this guide. Es stellte sich heraus über einen solchen Zusatz-Adapter:

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); 

Achten Sie auf numRows. Bevor wir eine physische Ansicht hinzufügen, wissen wir nicht, wie viel Spalten wir haben werden. Und wir können nicht wissen, wie viele Zellen (breit) Werbung aufnehmen. Es ist möglich, dass Sie die Standardmethode AsymmetricGridView verwenden können.

ich diesen schrecklichen Code zu verwenden hatte ( Darin meine Konstanten verstopft.

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 

die Magie in den Adapter Alle PreviewsAdapter erstreckt BaseAdapter

Bestimmen Sie, wo es ist Werbung. Ich möchte die Mitte

adsId = currentPreviews.size()/2; 

Forge eine Reihe von Einträgen Unsere Einträge nums + ad

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

Jetzt werden wir das Objekt zurückgeben. Es sind entweder unsere Mitglieder oder Werbung.

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

Unser Objekt muss AsymmetricItem implementieren. Werbung auch. Hier ist ein Beispiel für die Objektklassenwerbung.

getRowSpan, getColumnSpan die Breite und Höhe des Objekts bestimmen View in cells.

Und hier ist die Methode Ansicht zu erhalten:

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; 
     } 
    } 

Aber ich bin nicht sicher, über diese Linie:

imageView = (SquareImageView) convertView; 

Ich weiß nicht, ob AdView dorthin zu gelangen. Aber solange es nicht kaputt ist: D

Um mit Klicks umzugehen musste eine andere Methode schreiben.

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

Dies ist sicherlich nicht der schönste Code, aber es funktioniert. Ergebnis: enter image description here

2

Meiner Meinung nach ist der beste Weg, um RecyclerView mit GridLayoutManager zu verwenden. Geben Sie einfach SpanSizeLookup für GridLayoutManager an, das die Größe jeder Position bestimmen kann. Zum Beispiel muß erste Position vollständige Reihe

//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); 
      } 
     }); 

In Ihrem Adapter bieten 2 Arten von Gegenständen ocupate - normal Artikeln und Werbung Artikel

Es wird bevorzugt eingestellt Artikel Polsterungen über ItemDecoration.

kann ich mehr Code zur Verfügung stellen, wenn

benötigen