首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将放在回收器视图中,android?

如何将放在回收器视图中,android?
EN

Stack Overflow用户
提问于 2020-07-01 05:32:33
回答 3查看 14.5K关注 0票数 3

我希望将admob本地高级广告放在我在android应用程序中回收者视图的每3个位置。

我想提供的模板由Admob。

https://github.com/googleads/googleads-mobile-android-native-templates

这里是本地ads的xml代码实现。

代码语言:javascript
运行
复制
<com.google.android.ads.nativetemplates.TemplateView
android:id="@+id/my_template"
<!-- this attribute determines which template is used. The other option is
@layout/gnt_medium_template_view -->
app:gnt_template_type="@layout/gnt_small_template_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />

以下是Admob的Java代码实现

代码语言:javascript
运行
复制
   MobileAds.initialize(this, "[_app-id_]");
   AdLoader adLoader = new AdLoader.Builder(this, "[_ad-unit-id_]")
 .forUnifiedNativeAd(new UnifiedNativeAd.OnUnifiedNativeAdLoadedListener() {
   @Override
   public void onUnifiedNativeAdLoaded(UnifiedNativeAd unifiedNativeAd) {
      NativeTemplateStyle styles = new
          NativeTemplateStyle.Builder().withMainBackgroundColor(background).build();

      TemplateView template = findViewById(R.id.my_template);
      template.setStyles(styles);
      template.setNativeAd(unifiedNativeAd);

    }
 })
 .build();

  adLoader.loadAd(new AdRequest.Builder().build());
 }

RecyclerView适配器类

代码语言:javascript
运行
复制
public class ArticleAdapter extends RecyclerView.Adapter<ArticleAdapter.MyViewHolder>{
private Context mContext;
private List<ArticleJson> articleList;
String titleoflist;

public class MyViewHolder extends RecyclerView.ViewHolder {
    TextView txtTitle,txtDesc,txtStatus,txtColor,txtAuthor;
    LinearLayout linearLayout;
    private ArticleJson m_articleJson;

    public MyViewHolder(View view) {
        super(view);
        txtTitle = view.findViewById(R.id.texViewArticleTitle)
        linearLayout = view.findViewById(R.id.article_linearlayout);
    }

    public void bindView(final ArticleJson articleJson){
        m_articleJson = articleJson;
        txtTitle.setText(articleJson.getmTitle());
        txtAuthor.setText(titleoflist);
    }
}

public ArticleAdapter(Context mContext, List<ArticleJson> articleList,String titleoflist) {
    this.mContext = mContext;
    this.articleList = articleList;
    this.titleoflist = titleoflist;
}

@NonNull
@Override
public ArticleAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

    View itemView = LayoutInflater.from(parent.getContext())
          .inflate(R.layout.list_item_article, parent, false);
   return new ArticleAdapter.MyViewHolder(itemView);
}

@Override
public void onBindViewHolder(@NonNull ArticleAdapter.MyViewHolder holder, int position) {
final ArticleJson articleJson = articleList.get(position);
    holder.bindView(articleJson);
    holder.linearLayout.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
      //Toast
    }
});
}

@Override
public int getItemCount() {
    return articleList.size();
}
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-07-15 19:21:15

首先,您需要创建Ads容器item_ads.xml 文件夹

代码语言:javascript
运行
复制
<com.google.android.ads.nativetemplates.TemplateView
    android:id="@+id/my_template"
    <!-- this attribute determines which template is used. The other option is
    @layout/gnt_medium_template_view -->
    app:gnt_template_type="@layout/gnt_small_template_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

第二,回收视图适配器必须扩展以下

代码语言:javascript
运行
复制
 extends RecyclerView.Adapter<RecyclerView.ViewHolder> 

现在您需要重写4方法。

public RecyclerView.ViewHolder onCreateViewHolder()

public void onBindViewHolder()

public int getItemCount()

public int getItemViewType()

在getItemViwType()方法中,我们将定义两种可能性

代码语言:javascript
运行
复制
@Override
public int getItemViewType(int position) {     
    if (AD_LOGIC_CONDITION)) {
        return AD_TYPE;
    } else{  
        return CONTENT_TYPE; ///do not forget to initialize any of AD_TYPE and CONTENT_TYPE
    }
}

然后我们将创建两个视图持有者,一个用于您的内容,另一个用于您的广告,我假设您知道如何创建您的视图持有者,所以我将解释广告视图持有人。

代码语言:javascript
运行
复制
class adViewHolder extends RecyclerView.ViewHolder {
        TemplateView Adtemplate;

        public adViewHolder(@NonNull View itemView) {
            super(itemView);
            Adtemplate = itemView.findViewById(R.id.my_template);
        } 

现在我们返回到onCreateViewHolder()方法

代码语言:javascript
运行
复制
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        if (viewType == AD_TYPE) {
            adViewHolder madViewHolder = new adViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_ads, null, false));
            return madViewHolder;
        } else{
            YourViewHolder mYourViewHolder = new YourViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_item, null, false));
            return mYourViewHolder;
        }
}

现在我们转到onBindViewHolder()方法

代码语言:javascript
运行
复制
 @Override
        public void onBindViewHolder(@NonNull final RecyclerView.ViewHolder holder, int position) {
            if (getItemViewType(position) == TYPE_CONTENT) {
                ///your data 
// AN EXAMPLE
                ((YourViewHolder) holder).textview.setText(data.getmtext());
                ((YourViewHolder) holder).Img.setImageResource(data.getmImg());
                ((YourViewHolder) holder).title.setText(data.getmName());
            } else if (getItemViewType(position) == TYPE_AD){
    
                final AdLoader adLoader = new AdLoader.Builder(context, "ca-app-pub-3940256099942544/2247696110")
                        .forUnifiedNativeAd(new UnifiedNativeAd.OnUnifiedNativeAdLoadedListener() {
                            @Override
                            public void onUnifiedNativeAdLoaded(UnifiedNativeAd unifiedNativeAd) {
                                // Show the ad.
                                NativeTemplateStyle styles = new
                                        NativeTemplateStyle.Builder().build();
    
                                TemplateView template = ((adViewHolder) holder).Adtemplate;
                                template.setStyles(styles);
                                template.setNativeAd(unifiedNativeAd);
    
                            }
                        })
                        .withAdListener(new AdListener() {
                            @Override
                            public void onAdFailedToLoad(int errorCode) {
                                // Handle the failure by logging, altering the UI, and so on.
                            }
                        })
                        .withNativeAdOptions(new NativeAdOptions.Builder()
                                // Methods in the NativeAdOptions.Builder class can be
                                // used here to specify individual options settings.
                                .build())
                        .build();
                adLoader.loadAd(new AdRequest.Builder().build());
    
    
            }
票数 10
EN

Stack Overflow用户

发布于 2021-02-27 14:03:49

MainActivity.java

代码语言:javascript
运行
复制
    RecyclerView rvContacts = (RecyclerView) findViewById(R.id.rvContacts);

    // Initialize contacts
   contacts = Contact.createContactsList(20);

    // Create adapter passing in the sample user data
   ContactsAdapter adapter = new ContactsAdapter(contacts);

    //Build the native adapter from the current adapter
    AdmobNativeAdAdapter admobNativeAdAdapter=AdmobNativeAdAdapter.Builder.with(
            "ca-app-pub-3940256099942544/2247696110",//admob native ad id
            adapter,//current adapter
            "small"//Set the size "small", "medium" or "custom"
            ).adItemInterval(5)//Repeat interval
            .build();


    // Attach the new adapter to the recyclerview to populate items
    rvContacts.setAdapter(admobNativeAdAdapter);

    // Set layout manager to position the items
    rvContacts.setLayoutManager(new LinearLayoutManager(this));
}

多读 回收视图-本地广告-示例-Github

票数 1
EN

Stack Overflow用户

发布于 2020-07-01 20:32:41

在文章列表中,用"null“值填充第三个条目(如果需要,可以使用"Ad”字符串值)。

在为列表条目设置"null“值的Adapter中,content_type = "AD_TYPE":

代码语言:javascript
运行
复制
    @Override
    public int getItemViewType(int position) {     
        if (yourList.get(position).getArticle().equals("null")) {
            ADPosition = position;
            return AD_TYPE;
        }
        return CONTENT_TYPE;
    }

在您的ViewHolderClass中,AD_Layout用于AD_TYPE条目,而普通布局用于CONTENT_TYPE条目。

代码语言:javascript
运行
复制
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == CONTENT_TYPE) {
    itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.normalLayoutRecyclerView,prent,false);
    return new MyViewHolder(itemView)
}
if (viewType == AD_TYPE) {
itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.ad_layout, parent, false);
}

return new MyViewHolder(itemView)

}

希望这能有所帮助。

GGK

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62670307

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档