11

次の画像のような画面を持つAndroidアプリを開発しています- ここに画像の説明を入力

セル間のバナー広告に注目してください。GridView はこのような列のスパンをサポートしていないため、何をすべきか途方に暮れています。

できる限りの提案をしてください。前もって感謝します。

4

4 に答える 4

3

Gridview アダプターでアイテムの 2 つのレイアウトを作成する必要があります。1 つは表示したいもの、もう 1 つは adView 用で、ビューの作成中にレイアウトを交互に配置します。

これをチェックして、より多くのアイデアを得ることができます。

于 2014-11-11T05:54:51.830 に答える
3

さて、コードの例を挙げられると思います... まず、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;

いくつかのエントリを偽造します。エントリー番号 + 広告

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 の幅と高さを決定します。

そして、ビューを取得する方法は次のとおりです。

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

これは確かに最も美しいコードではありませんが、機能します。結果: ここに画像の説明を入力

于 2015-09-26T21:59:46.683 に答える
2

カスタムArrayAdapterを実装します。例を次に示します:カスタム アダプターの開発

于 2014-11-10T11:38:56.757 に答える