簡體   English   中英

如何在gridview中間歇性地展示橫幅廣告

[英]How to show banner ads intermittently in gridview

我正在開發一個Android應用程序,它將具有類似於下圖的屏幕 - 在此輸入圖像描述

請注意單元格之間的橫幅廣告。 由於GridView不支持這種列的跨越,我不知道該怎么做。

請提供任何建議。 提前致謝。

您需要為Gridview Adapter中的項創建兩個布局。 一個用於您要顯示的內容,另一個用於adView,並在創建視圖時交替放置布局。

檢查這個以獲得更多想法。

好吧,我想我可以給你代碼示例......首先,我添加了AsymmetricGridView

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

我用這個指南 事實證明這是一個額外的適配器:

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

注意numRows 在添加物理視圖之前,我們不知道我們將有多少列。 而且我們無法知道有多少單元格(寬)需要廣告。您可以使用標准方法AsymmetricGridView。

我不得不使用這個可怕的代碼(在它中堵塞了我的常量。

    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

適配器PreviewsAdapter中的所有魔術都擴展了BaseAdapter

確定廣告的位置。 我想在中間

adsId  = currentPreviews.size() / 2;

偽造一些條目。 我們的條目是nums + ad

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

現在我們將返回該對象。 這是我們的會員或廣告。

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

我們的對象必須實現AsymmetricItem。 廣告也是。 以下是對象類廣告的示例。

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確定對象View在單元格中的寬度和高度。

以下是獲取View的方法:

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

但我不確定這一行:

imageView = (SquareImageView) convertView;

我不知道是否到那里AdView 但它並沒有破產:D

要處理點擊,必須編寫另一種方法。

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

這肯定不是最漂亮的代碼,但它確實有效。 結果: 在此輸入圖像描述

在我看來,最好的方法是使用RecyclerView和GridLayoutManager。 只需為GridLayoutManager提供SpanSizeLookup即可確定每個位置的大小。 例如,第一個位置需要ocupate完整行

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

在您的適配器中提供2種類型的項目 - 常用項目和廣告項目

最好通過ItemDecoration設置項目填充。

如果需要,我可以提供更多代碼

實現自定義ArrayAdapter ,這是一個示例: 開發自定義適配器

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM