Статьи

Встраивание рекламы AdMob в Android ListViews

Работая над StackAnywhere (новым клиентом Android для Stack Overflow и других сайтов Stack Exchange ), я пытался выяснить, как лучше всего включить рекламу AdMob в пользовательский интерфейс, чтобы сделать приложение бесплатным для загрузки. Камнем преткновения было то, что с некоторым пространством, уже занятым навигацией с вкладками , дополнительное пространство, занимаемое рекламой, имело тенденцию делать пользовательский интерфейс очень тесным с небольшим пространством для контента. Это было особенно проблематично в альбомной ориентации, поскольку рекламные объявления имеют те же размеры, что и в портретном режиме, что означает, что они занимают пропорционально больше места по вертикали, в то же время тратя пространство по горизонтали.

StackAnywhere с рекламой в ListViewПоскольку большинство действий StackAnywhere включают ListViews , я в конечном итоге натолкнулся на идею встраивания рекламы в списки. Это не совсем оригинальная идея, есть и другие приложения, которые делают что-то похожее, но у них есть преимущество в том, что они размещают рекламу на видном месте, а также позволяют пользователю прокручивать ее за пределы экрана и убирать с дороги.

Реализация этого решения достаточно проста, хотя есть несколько мелких ошибок, которые следует избегать. Картина декоратор является идеальным подходом к использованию , так как он позволяет добавлять объявления в существующем списке адаптер без необходимости изменять код для этого адаптера. Моя наивная первая попытка привела к нарушению ClassCastException при добавлении AdView в список, и у меня также были некоторые проблемы с фокусировкой, которые нужно было решить. Код ниже является упрощенной версией того, что используется в StackAnywhere. Реализация просто добавляет одно объявление вверху списка. Вы можете легко изменить это, чтобы показать больше рекламы, если хотите. Например, вы можете показывать рекламу после каждых 10 позиций. Код предполагает, что вы используете новый Google AdMob SDK (версия 4.0.4 в данном случае), а не старый AdMob SDK.

import android.database.DataSetObserver;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseAdapter;
import com.google.ads.AdRequest;
import com.google.ads.AdSize;
import com.google.ads.AdView;
 
/**
 * List adapter decorator that inserts adverts into the list.
 * @author Daniel Dyer
 */
public class AdvertisingAdapter extends BaseAdapter
{
    private static final String ADMOB_PUBLISHER_ID = "YOUR_ADMOB_ID_HERE";
 
    private final Activity activity;
    private final BaseAdapter delegate;
 
    public AdvertisingAdapter(Activity activity, BaseAdapter delegate)
    {
        this.activity = activity;
        this.delegate = delegate;
        delegate.registerDataSetObserver(new DataSetObserver()
        {
            @Override
            public void onChanged()
            {
                notifyDataSetChanged();
            }
 
            @Override
            public void onInvalidated()
            {
                notifyDataSetInvalidated();
            }
        });
    }
 
    public int getCount()
    {
        return delegate.getCount() + 1;
    }
 
    public Object getItem(int i)
    {
        return delegate.getItem(i - 1);
    }
 
    public long getItemId(int i)
    {
        return delegate.getItemId(i - 1);
    }
 
    public View getView(int position, View convertView, ViewGroup parent)
    {
        if (position == 0)
        {
            if (convertView instanceof AdView)
            {
                return convertView;
            }
            else
            {
                AdView adView = new AdView(activity, AdSize.BANNER, ADMOB_PUBLISHER_ID);
                // Disable focus for sub-views of the AdView to avoid problems with
                // trackpad navigation of the list.
                for (int i = 0; i < adView.getChildCount(); i++)
                {
                    adView.getChildAt(i).setFocusable(false);
                }
                adView.setFocusable(false);
                // Default layout params have to be converted to ListView compatible
                // params otherwise there will be a ClassCastException.
                float density = activity.getResources().getDisplayMetrics().density;
                int height = Math.round(AdSize.BANNER.getHeight() * density);
                AbsListView.LayoutParams params
                    = new AbsListView.LayoutParams(AbsListView.LayoutParams.FILL_PARENT,
                                                   height);
                adView.setLayoutParams(params);
                adView.loadAd(new AdRequest());
                return adView;
            }
        }
        else
        {
            return delegate.getView(position - 1, convertView, parent);
        }
    }
 
    @Override
    public int getViewTypeCount()
    {
        return delegate.getViewTypeCount() + 1;
    }
 
    @Override
    public int getItemViewType(int position)
    {
        return position == 0 ? delegate.getViewTypeCount()
                             : delegate.getItemViewType(position - 1);
    }
 
    @Override
    public boolean areAllItemsEnabled()
    {
        return false;
    }
 
    @Override
    public boolean isEnabled(int position)
    {
        return position != 0 && delegate.isEnabled(position - 1);
    }
}

 

С http://blog.uncommons.org/2011/05/09/embedding-admob-adverts-in-android-listviews