如何在用户点击列表视图项目而不是 Android 中的每个项目后显示广告?
How to show ad after user clicks on listview item but not for every item in Android?
我有一个列表视图,其中填充了来自远程数据库的数据。当用户单击某个项目时,他们将被带到详细信息屏幕。我的问题是当用户点击列表项时我如何显示和广告,而不是每次他们点击列表项时。我不想每次点击列表项时都显示广告,就像每 5 次左右点击后一样。我该怎么做呢?我假设列表视图 onItemClickListener 中存在某种逻辑。我只是不知道那个逻辑会是什么样子。
编辑
根据 user8 的回答,我向 onItemClickListener 添加了一个计数器和共享首选项。但是,当我单击某个项目时没有任何反应。甚至看不到 DetailActivity。这是我的代码:
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//Get item at position
RowData item = (RowData)parent.getItemAtPosition(position);
final Intent intent = new Intent(MainActivity.this, DetailActivity.class);
mInterstitialAd.setAdListener(new AdListener() {
@Override
public void onAdClosed() {
requestNewInterstitial();
startActivity(intent);
}
});
SharedPreferences prefs = getPreferences(MODE_PRIVATE);
int clickCount = prefs.getInt(KEY_CLICK_COUNT, 1);
if (clickCount % 5 == 0) {
if (mInterstitialAd.isLoaded()) {
mInterstitialAd.show();
} else {
startActivity(intent);
}
}
clickCount++;
prefs.edit().putInt(KEY_CLICK_COUNT, clickCount).apply();
//Start details activity
//startActivity(intent);
}
});
编辑 2
好的。我知道出了什么问题。根据 user8 的回答,当用户点击 5 次时,它会显示广告,但如果用户点击次数少于 5 次,则什么也不会发生。所以我添加了一个 else 语句,所以现在用户可以单击一个列表项并转到详细信息 activity。广告仍会在每 5 次点击后展示,但不会 "stale" 显示在广告之间。这是工作代码:
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//Get item at position
RowData item = (RowData)parent.getItemAtPosition(position);
final Intent intent = new Intent(MainActivity.this, DetailActivity.class);
mInterstitialAd.setAdListener(new AdListener() {
@Override
public void onAdClosed() {
requestNewInterstitial();
startActivity(intent);
}
});
SharedPreferences prefs = getPreferences(MODE_PRIVATE);
int clickCount = prefs.getInt(KEY_CLICK_COUNT, 1);
if (clickCount % 5 == 0) {
if (mInterstitialAd.isLoaded()) {
mInterstitialAd.show();
} else {
startActivity(intent);
}
}else{
startActivity(intent);
}
clickCount++;
prefs.edit().putInt(KEY_CLICK_COUNT, clickCount).apply();
//Start details activity
//startActivity(intent);
}
});
有很多方法可以做到这一点,这取决于对您来说最简单的方法。
1) 正如 Daniel K 在他的评论中提到的,保存在 class 本身中的计数器变量可以在每次注册点击时递增
2) 您可以使用 shared preferences 保留一个稍微更持久的变量(在应用程序关闭后会持续存在)
3) 如果你有一个 MyApplication class,你也可以在那里使用静态变量,它的功能与选项 1 相同。
4) 您可以使用数据库(尽管老实说这可能需要太多工作)。
我个人会推荐共享首选项,因为即使在用户关闭并重新打开应用程序后,它也会跟踪点击次数,这样,如果用户点击 4 次,关闭应用程序,并在另一天回来再点击 4 次(一次又一次),您仍然会每点击 5 次得到一个结果,而不是等待他们在一次会话中点击 5 次。
-PGMac
您可以在 ListView
的 OnItemClickListener
中执行类似的操作:
SharedPreferences prefs = getPreferences(MODE_PRIVATE);
int clickCount = prefs.getInt(KEY_CLICK_COUNT, 0);
if (clickCount > 0 && clickCount % 5 == 0) {
showAd();
}
clickCount++;
prefs.edit().putInt(KEY_CLICK_COUNT, clickCount).apply();
我通过以下更改解决了这个问题。我想在每点击 3 次后显示它。
@Override
public void onClick(View view) {
int position = getAdapterPosition();
final Intent intent=new Intent(getActivity(),VideoPlayActivity.class);
intent.putExtra("data",childlistData.get(position).getData());
SharedPreferences prefs = getActivity().getPreferences(MODE_PRIVATE);
int clickCount = prefs.getInt(KEY_CLICK_COUNT, 1);
if (clickCount % 3 == 0) {
interstitial = new InterstitialAd(getActivity());
interstitial.setAdUnitId(getString(R.string.interstitial_full_screen));
AdRequest adRequest2 = new AdRequest.Builder().build();
interstitial.loadAd(adRequest2);
interstitial.setAdListener(new AdListener() {
public void onAdLoaded() {
interstitial.show();
}
@Override
public void onAdClosed() {
//Toast.makeText(getApplicationContext(), "Ad is closed!", Toast.LENGTH_SHORT).show();
startActivity(intent);
}
@Override
public void onAdFailedToLoad(int errorCode) {
//Toast.makeText(getApplicationContext(), "Ad failed to load! error code: " + errorCode, Toast.LENGTH_SHORT).show();
}
@Override
public void onAdLeftApplication() {
// Toast.makeText(getApplicationContext(), "Ad left application!", Toast.LENGTH_SHORT).show();
}
@Override
public void onAdOpened() {
//Toast.makeText(getApplicationContext(), "Ad is opened!", Toast.LENGTH_SHORT).show();
}
});
System.out.println(" divisible by 3 "+clickCount);
}else{
System.out.println("not divisible by 3 "+clickCount);
startActivity(intent);
}
clickCount++;
System.out.println("Counter Value"+clickCount);
prefs.edit().putInt(KEY_CLICK_COUNT, clickCount).apply();
}
我有一个列表视图,其中填充了来自远程数据库的数据。当用户单击某个项目时,他们将被带到详细信息屏幕。我的问题是当用户点击列表项时我如何显示和广告,而不是每次他们点击列表项时。我不想每次点击列表项时都显示广告,就像每 5 次左右点击后一样。我该怎么做呢?我假设列表视图 onItemClickListener 中存在某种逻辑。我只是不知道那个逻辑会是什么样子。
编辑
根据 user8 的回答,我向 onItemClickListener 添加了一个计数器和共享首选项。但是,当我单击某个项目时没有任何反应。甚至看不到 DetailActivity。这是我的代码:
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//Get item at position
RowData item = (RowData)parent.getItemAtPosition(position);
final Intent intent = new Intent(MainActivity.this, DetailActivity.class);
mInterstitialAd.setAdListener(new AdListener() {
@Override
public void onAdClosed() {
requestNewInterstitial();
startActivity(intent);
}
});
SharedPreferences prefs = getPreferences(MODE_PRIVATE);
int clickCount = prefs.getInt(KEY_CLICK_COUNT, 1);
if (clickCount % 5 == 0) {
if (mInterstitialAd.isLoaded()) {
mInterstitialAd.show();
} else {
startActivity(intent);
}
}
clickCount++;
prefs.edit().putInt(KEY_CLICK_COUNT, clickCount).apply();
//Start details activity
//startActivity(intent);
}
});
编辑 2
好的。我知道出了什么问题。根据 user8 的回答,当用户点击 5 次时,它会显示广告,但如果用户点击次数少于 5 次,则什么也不会发生。所以我添加了一个 else 语句,所以现在用户可以单击一个列表项并转到详细信息 activity。广告仍会在每 5 次点击后展示,但不会 "stale" 显示在广告之间。这是工作代码:
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//Get item at position
RowData item = (RowData)parent.getItemAtPosition(position);
final Intent intent = new Intent(MainActivity.this, DetailActivity.class);
mInterstitialAd.setAdListener(new AdListener() {
@Override
public void onAdClosed() {
requestNewInterstitial();
startActivity(intent);
}
});
SharedPreferences prefs = getPreferences(MODE_PRIVATE);
int clickCount = prefs.getInt(KEY_CLICK_COUNT, 1);
if (clickCount % 5 == 0) {
if (mInterstitialAd.isLoaded()) {
mInterstitialAd.show();
} else {
startActivity(intent);
}
}else{
startActivity(intent);
}
clickCount++;
prefs.edit().putInt(KEY_CLICK_COUNT, clickCount).apply();
//Start details activity
//startActivity(intent);
}
});
有很多方法可以做到这一点,这取决于对您来说最简单的方法。
1) 正如 Daniel K 在他的评论中提到的,保存在 class 本身中的计数器变量可以在每次注册点击时递增
2) 您可以使用 shared preferences 保留一个稍微更持久的变量(在应用程序关闭后会持续存在)
3) 如果你有一个 MyApplication class,你也可以在那里使用静态变量,它的功能与选项 1 相同。
4) 您可以使用数据库(尽管老实说这可能需要太多工作)。
我个人会推荐共享首选项,因为即使在用户关闭并重新打开应用程序后,它也会跟踪点击次数,这样,如果用户点击 4 次,关闭应用程序,并在另一天回来再点击 4 次(一次又一次),您仍然会每点击 5 次得到一个结果,而不是等待他们在一次会话中点击 5 次。
-PGMac
您可以在 ListView
的 OnItemClickListener
中执行类似的操作:
SharedPreferences prefs = getPreferences(MODE_PRIVATE);
int clickCount = prefs.getInt(KEY_CLICK_COUNT, 0);
if (clickCount > 0 && clickCount % 5 == 0) {
showAd();
}
clickCount++;
prefs.edit().putInt(KEY_CLICK_COUNT, clickCount).apply();
我通过以下更改解决了这个问题。我想在每点击 3 次后显示它。
@Override
public void onClick(View view) {
int position = getAdapterPosition();
final Intent intent=new Intent(getActivity(),VideoPlayActivity.class);
intent.putExtra("data",childlistData.get(position).getData());
SharedPreferences prefs = getActivity().getPreferences(MODE_PRIVATE);
int clickCount = prefs.getInt(KEY_CLICK_COUNT, 1);
if (clickCount % 3 == 0) {
interstitial = new InterstitialAd(getActivity());
interstitial.setAdUnitId(getString(R.string.interstitial_full_screen));
AdRequest adRequest2 = new AdRequest.Builder().build();
interstitial.loadAd(adRequest2);
interstitial.setAdListener(new AdListener() {
public void onAdLoaded() {
interstitial.show();
}
@Override
public void onAdClosed() {
//Toast.makeText(getApplicationContext(), "Ad is closed!", Toast.LENGTH_SHORT).show();
startActivity(intent);
}
@Override
public void onAdFailedToLoad(int errorCode) {
//Toast.makeText(getApplicationContext(), "Ad failed to load! error code: " + errorCode, Toast.LENGTH_SHORT).show();
}
@Override
public void onAdLeftApplication() {
// Toast.makeText(getApplicationContext(), "Ad left application!", Toast.LENGTH_SHORT).show();
}
@Override
public void onAdOpened() {
//Toast.makeText(getApplicationContext(), "Ad is opened!", Toast.LENGTH_SHORT).show();
}
});
System.out.println(" divisible by 3 "+clickCount);
}else{
System.out.println("not divisible by 3 "+clickCount);
startActivity(intent);
}
clickCount++;
System.out.println("Counter Value"+clickCount);
prefs.edit().putInt(KEY_CLICK_COUNT, clickCount).apply();
}