次の画像のような画面を持つAndroidアプリを開発しています-
セル間のバナー広告に注目してください。GridView はこのような列のスパンをサポートしていないため、何をすべきか途方に暮れています。
できる限りの提案をしてください。前もって感謝します。
次の画像のような画面を持つAndroidアプリを開発しています-
セル間のバナー広告に注目してください。GridView はこのような列のスパンをサポートしていないため、何をすべきか途方に暮れています。
できる限りの提案をしてください。前もって感謝します。
Gridview アダプターでアイテムの 2 つのレイアウトを作成する必要があります。1 つは表示したいもの、もう 1 つは 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;
いくつかのエントリを偽造します。エントリー番号 + 広告
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);
}
カスタムArrayAdapterを実装します。例を次に示します:カスタム アダプターの開発