获取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
相关产品推荐
相关产品推荐

