Встраивание рекламы в Recyclerview
Я пытаюсь обновить свое приложение от просмотра списка до повторного просмотра. Когда я использовал просмотр списка, я включил рекламу в просмотр списка, используя это руководство.
Я не могу добавить его в утилитаре аналогичным образом. Любые мнения о том, как это сделать в Recyclerview?
В настоящее время в моем списке просмотра приведен следующий код для загрузки рекламы:
if ((position % k) == 0) {
if (convertView instanceof AdView) {
return convertView;
} else {
// Create a new AdView
AdView adView = new AdView(activity, AdSize.BANNER,
ADMOB_ID);
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 - (int) Math.ceil(position / k) - 1,
convertView, parent);
}
Вот как это должно выглядеть:
Обновление: см. Это видео от Google, оно дает полное объяснение
7 ответов
В вашем адаптере вам сначала нужно переопределить getItemViewType, например:
@Override
public int getItemViewType(int position)
{
if (position % 5 == 0)
return AD_TYPE;
return CONTENT_TYPE;
}
Затем в onCreateViewHolder надуйте другое представление в соответствии с типом. Что-то вроде этого:
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType)
{
View v = null;
if (viewType == AD_TYPE)
{
v = new AdView(activity, AdSize.BANNER, ADMOB_ID);
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);
v.setLayoutParams(params);
v.loadAd(new AdRequest());
}
else
v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_item_layout, viewGroup, false);
RecyclerView.ViewHolder viewHolder = new RecyclerView.ViewHolder(v);
return viewHolder;
}
Как добавить элементы списка AD и не пропускать элементы содержимого и не вставлять нулевые элементы в список содержимого?
private static final int LIST_AD_DELTA = 3;
private static final int CONTENT = 0;
private static final int AD = 1;
@Override
public int getItemViewType(int position) {
if (position > 0 && position % LIST_AD_DELTA == 0) {
return AD;
}
return CONTENT;
}
@Override
public BaseRecyclerHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == CONTENT) {
return new ContentRecyclerHolder(parent, layoutId) {
@Override
protected void onCardClick(CardView card) {
fragmentManager.showPagerFragmentWithTransition(card.getContext(), getRealPosition(getAdapterPosition()));
}
};
} else {
return new AdRecyclerHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_ad, parent, false));
}
}
@Override
public int getItemCount() {
int additionalContent = 0;
if (data.size() > 0 && LIST_AD_DELTA > 0 && data.size() > LIST_AD_DELTA) {
additionalContent = data.size() / LIST_AD_DELTA;
}
return data.size() + additionalContent;
}
@Override
public void onBindViewHolder(BaseRecyclerHolder baseHolder, int position) {
if (getItemViewType(position) == CONTENT) {
ContentRecyclerHolder holder = (ContentRecyclerHolder) baseHolder;
Content content = data.get(getRealPosition(position));
} else {
AdRecyclerHolder holder = (AdRecyclerHolder) baseHolder;
holder.adView.loadAd();
}
}
private int getRealPosition(int position) {
if (LIST_AD_DELTA == 0) {
return position;
} else {
return position - position / LIST_AD_DELTA;
}
}
В вашем ArrayList добавьте нулевые значения в позиции, которые вы хотите показывать объявления
for(int i=0;i<arr.size();i++){
if(i%5==0)
{
alist.add(null);
}
alist.add(arr.get(i));
}
Затем в getItemViewType(),
@Override
public int getItemViewType(int position) {
if(qlist.get(position)==null)
return AD_TYPE;
return CONTENT_TYPE;
}
Затем,
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = null;
ViewHolder vh=null;
if (viewType == AD_TYPE)
{
v=inflater.inflate(R.layout.adview_item, parent, false);
vh=new AdviewHolder(v);
}
else {
v = inflater.inflate(R.layout.cardview_items, parent, false);
vh = new ContentViewHolder(v);
}
return vh;
}
Это не будет пропускать какие-либо элементы, но будет вставлять рекламу на необходимые позиции.
Я использую модификацию с конвертером gson и мне нужно показывать рекламу после каждых 5 пунктов. Используя вышеупомянутый ответ, я получил неправильную позицию для предмета. Поэтому я вставил пользовательское значение в каждый 5-й элемент в ответе json.
call.enqueue(new Callback<List<DataModel>>() {
@Override
public void onResponse(Call<List<DataModel>> call, Response<List<DataModel>> response) {
if (response.body() != null) {
List<DataModel> list_Data = response.body();
List<DataModel> list_ad_Data = new ArrayList<>();
for (int i = 0; i < list_Data.size(); i++) {
if (i %5 == 0 ){
list_ad_Data.add(null);
}
list_ad_Data.add(list_Data.get(i));
}
adapter = new HomeAdapter(getActivity(), list_ad_Data);
В моем адаптере. Я изменил тип просмотра в соответствии с
@Override
public int getItemViewType(int position) {
if (list_data.get(position) == null) {
return AD;
}
return CONTENT;
}
Изменение вида уже упоминалось в ответах выше. Надеюсь, это поможет будущим читателям.
Google предоставил код для реализации баннерной рекламы в RecycleView
,
Вы можете получить его из GITHUB: https://github.com/googlesamples/android-ads/tree/master/advanced/BannerRecyclerViewExample
Загружать рекламу проще через привязку данных, например:
@BindingAdapter({"bind:loadAds"})
public static void loadAds(AdView adView, boolean load) {
AdRequest adRequest = new AdRequest.Builder().build();
adView.loadAd(adRequest);
}
а затем в XML добавить это как AdView
app:loadAds='@{true}'
как это:
<com.google.android.gms.ads.AdView
android:id="@+id/adView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
ads:adSize="BANNER"
ads:adUnitId="ca-app-pub-3940256099942544/6300978111"
app:loadAds='@{true}'
/>
Я решаю проблему, просто изменив одну строку в onBindViewHolder()
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, @SuppressLint("RecyclerView") int position) {
if(holder.getItemViewType()==POST_TYPE) {
PostHolder postHolder=(PostHolder) holder;
int bindingPosition=position - position / LIST_AD_DELTA;
postHolder.textView.setText(List_Item.get(bindingPosition).getBtnText());
postHolder.cardView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(context, DetailActivity.class);
intent.putExtra("file", "file:///android_asset/" + List_Item.get(position).getHtmlFile());
context.startActivity(intent);
}
});
}else if(holder.getItemViewType()==AD_TYPE){
}