我已经迁移到androidx.preference .--库,新的PreferenceFragmentCompat使用RecyclerView而不是ListView。我有一个自定义的首选项视图,其中包含一个智能横幅AdMob,并且遇到滚动到AdView时将调整所有单元格的大小以及向后滚动时将再次调整所有单元格的大小的问题。
AndroidX的首选项使用onBindViewHolder而不是onCreateView,这是要适应的挑战。
引起此问题的行是holder.setIsRecyclable(false);
。没有它,AdViews将开始复制并且永远不会被删除,因此我认为false
标志是不可避免的。罪魁祸首可能是LinearLayout.addView(mAdView),但我找不到其他方法来使广告在没有它的情况下展示。
这里是AdPref.java
的全部,它扩展了androidx.preference.Preference
public class AdPref extends Preference {
static AdView mAdView;
//DEFAULT CONSTRUCTORS
//...
//...//
@Override
public void onBindViewHolder(PreferenceViewHolder holder) {
LinearLayoutCompat ll = (LinearLayoutCompat) holder.findViewById(R.id.lAd);
holder.setDividerAllowedAbove(false);
holder.setDividerAllowedBelow(false);
holder.setIsRecyclable(false); // SOLVES ONE PROBLEM, CREATES ANOTHER
MobileAds.initialize(getContext(), "id");
mAdView = new AdView(getContext());
mAdView.setAdSize(AdSize.SMART_BANNER);
mAdView.setAdUnitId("id");
AdRequest adRequest = new AdRequest.Builder().addTestDevice(AdRequest.DEVICE_ID_EMULATOR).build();
mAdView.loadAd(adRequest);
ll.addView(mAdView);
super.onBindViewHolder(holder);
}
当用户滚动到可见范围之外时,加载/删除广告的最佳方式是什么?