You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

获取RecyclerView条目点击次数,实现点击后展示Admob插屏广告

解决方案:RecyclerView条目点击2次后展示Admob插屏广告

我来帮你搞定这个需求!你当前的代码逻辑有两个核心问题:一是没有在用户点击RecyclerView条目时累加点击次数,二是广告触发的时机和流程不对。我们一步步修改代码,实现点击2次后展示插屏广告的效果:

第一步:给Adapter添加点击回调接口(解耦+避免内存泄漏)

首先,我们在DictionaryAdapter里定义一个点击回调接口,让主Activity来处理广告相关逻辑,这样Adapter不用直接持有Activity引用,避免内存泄漏:

public class DictionaryAdapter extends RecyclerView.Adapter<DictionaryAdapter.ViewHolder> {
    private Cursor cursor;
    private OnItemClickListener mListener; // 新增回调接口成员

    // 新增点击回调接口定义
    public interface OnItemClickListener {
        void onItemClicked(int currentClickCount);
    }

    // 新增设置回调的方法
    public void setOnItemClickListener(OnItemClickListener listener) {
        this.mListener = listener;
    }

    // 原有的构造方法、setCursor等代码保持不变...

    public class ViewHolder extends RecyclerView.ViewHolder {
        Context context;
        TextView word;

        public ViewHolder(@NonNull View itemView, final Context context) {
            super(itemView);
            this.context = context;
            word = itemView.findViewById(R.id.wordText);

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // 先处理无效位置点击的情况
                    int position = getAdapterPosition();
                    if (position == RecyclerView.NO_POSITION) return;

                    cursor.moveToPosition(position);
                    // 原有的页面跳转逻辑保持不变
                    Intent intent = new Intent(context, DetailActivity.class);
                    intent.putExtra("ID", cursor.getString(0));
                    intent.putExtra("WORD", cursor.getString(1));
                    intent.putExtra("DEFINITION", cursor.getString(2));
                    context.startActivity(intent);

                    // 核心:累加点击计数并保存
                    SharedPreferences preferences = context.getSharedPreferences("click_count", Context.MODE_PRIVATE);
                    int currentCount = preferences.getInt("count", 0);
                    currentCount++;
                    SharedPreferences.Editor editor = preferences.edit();
                    editor.putInt("count", currentCount);
                    editor.apply();

                    // 通知主Activity当前的点击次数
                    if (mListener != null) {
                        mListener.onItemClicked(currentCount);
                    }
                }
            });
        }
    }
}

第二步:在主Activity中实现回调,处理广告逻辑

接下来,我们在主Activity里初始化广告、实现回调接口,当点击次数达到2次时展示广告,并重置计数:

public class MainActivity extends AppCompatActivity {
    private InterstitialAd mInterstitialAd;
    private SharedPreferences preferences;
    private SharedPreferences.Editor editor;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 初始化SharedPreferences
        preferences = getSharedPreferences("click_count", MODE_PRIVATE);
        editor = preferences.edit();

        // 提前初始化插屏广告(建议提前加载,提升用户体验)
        initInterstitialAd();

        // 初始化RecyclerView和Adapter
        DictionaryAdapter adapter = new DictionaryAdapter();
        // 设置点击回调
        adapter.setOnItemClickListener(new DictionaryAdapter.OnItemClickListener() {
            @Override
            public void onItemClicked(int currentClickCount) {
                // 当点击次数达到2次时触发广告
                if (currentClickCount >= 2) {
                    showInterstitialAd();
                }
            }
        });

        // 其他RecyclerView的配置(设置LayoutManager、setAdapter等)...
    }

    // 初始化插屏广告的方法
    private void initInterstitialAd() {
        mInterstitialAd = new InterstitialAd(this);
        // 这里用的是AdMob测试ID,正式上线请替换成你的正式广告单元ID
        mInterstitialAd.setAdUnitId("ca-app-pub-3940256099942544/1033173712");
        // 提前加载一次广告
        loadInterstitialAd();
    }

    // 加载插屏广告的封装方法
    private void loadInterstitialAd() {
        mInterstitialAd.loadAd(new AdRequest.Builder().build());
    }

    // 展示插屏广告的方法
    private void showInterstitialAd() {
        if (mInterstitialAd.isLoaded()) {
            mInterstitialAd.show();
            // 广告展示后重置点击计数
            resetClickCount();
            // 重新加载下一次的广告,以备后续使用
            loadInterstitialAd();
        } else {
            // 如果广告还没加载完成,设置监听,加载完成后展示
            mInterstitialAd.setAdListener(new AdListener() {
                @Override
                public void onAdLoaded() {
                    mInterstitialAd.show();
                    resetClickCount();
                    loadInterstitialAd();
                }

                @Override
                public void onAdFailedToLoad(int errorCode) {
                    // 广告加载失败时也要重置计数,避免用户一直触发无效逻辑
                    resetClickCount();
                    // 可以在这里添加加载失败的提示(可选)
                }
            });
            // 重新发起广告加载请求
            loadInterstitialAd();
        }
    }

    // 重置点击计数的封装方法
    private void resetClickCount() {
        editor.putInt("count", 0);
        editor.apply();
    }
}

几个关键注意点

  • 处理无效位置点击:在ViewHolder的点击事件中判断getAdapterPosition() == RecyclerView.NO_POSITION,避免因RecyclerView复用导致的无效点击。
  • 提前加载广告:在Activity初始化时就加载广告,这样用户点击达到次数时能及时展示,提升体验。
  • 广告失败处理:如果广告加载失败,一定要重置计数,避免用户点击多次后一直触发加载逻辑。
  • 正式广告ID替换:上线前记得把测试广告单元ID换成你在AdMob后台申请的正式ID。

内容的提问来源于stack exchange,提问作者user11523404

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:47:01