Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 回收视图中的广告_Android_Android Recyclerview_Adapter_Ads - Fatal编程技术网

Android 回收视图中的广告

Android 回收视图中的广告,android,android-recyclerview,adapter,ads,Android,Android Recyclerview,Adapter,Ads,我有一个在房间数据库中存储一些数据的应用程序。起初,我的适配器是这样的: public class ViewCourseAdapter extends ListAdapter<Course, ViewCourseAdapter.ViewCourseHolder> { private int previousPosition = 0; public ViewCourseAdapter() { super(DIFF_CALLBACK); } private static

我有一个在房间数据库中存储一些数据的应用程序。起初,我的适配器是这样的:

public class ViewCourseAdapter extends ListAdapter<Course, ViewCourseAdapter.ViewCourseHolder> {

private int previousPosition = 0;

public ViewCourseAdapter() {

    super(DIFF_CALLBACK);

}

private static final DiffUtil.ItemCallback<Course> DIFF_CALLBACK = new DiffUtil.ItemCallback<Course>() {
    @Override
    public boolean areItemsTheSame(@NonNull Course oldItem, @NonNull Course newItem) {
        return oldItem.getId() == newItem.getId();
    }

    @Override
    public boolean areContentsTheSame(@NonNull Course oldItem, @NonNull Course newItem) {
        return oldItem.getfName().equals(newItem.getfName());
    }
};

@NonNull
@Override
public ViewCourseHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.view_courses_item, parent, false);
    return new ViewCourseHolder(itemView);
}

@Override
public void onBindViewHolder(@NonNull ViewCourseHolder holder, int position) {

    Course currentCourse = getItem(position);

    String fullName = currentCourse.getfName() + " " + currentCourse.getlName();
    SpannableString SfullName = new SpannableString(fullName);
    SfullName.setSpan(new UnderlineSpan(), 0, fullName.length(), 0);

    holder.text_view_firstName_1.setText(SfullName);

    if (position > previousPosition) {
        AnimationUtil.animate(holder, true);
    } else {
        AnimationUtil.animate(holder, false);
    }

    previousPosition = position;

}

class ViewCourseHolder extends RecyclerView.ViewHolder {

    private TextView text_view_firstName_1;

    ViewCourseHolder(@NonNull View itemView) {
        super(itemView);

        text_view_firstName_1 = itemView.findViewById(R.id.text_view_firstName_1);

    }

}

@Override
public int getItemCount() {
    return super.getItemCount();
}
public类viewcoursedapter扩展ListAdapter{
private int previousPosition=0;
公共视图CourseApter(){
超级(差异回调);
}
私有静态final DiffUtil.ItemCallback DIFF_CALLBACK=new DiffUtil.ItemCallback(){
@凌驾
公共布尔值AreItemsSame(@NonNull课程oldItem,@NonNull课程newItem){
返回oldItem.getId()==newItem.getId();
}
@凌驾
公共布尔值是相同的内容(@NonNull课程旧项,@NonNull课程新项){
返回oldItem.getfName().equals(newItem.getfName());
}
};
@非空
@凌驾
public ViewCourseHolder onCreateViewHolder(@NonNull ViewGroup父级,int-viewType){
View itemView=LayoutInflater.from(parent.getContext())
.充气(R.layout.view\u courses\u项目,父项,false);
返回新的ViewCourseHolder(itemView);
}
@凌驾
public void onBindViewHolder(@NonNull ViewCourseHolder,int位置){
课程currentCourse=getItem(位置);
字符串fullName=currentCourse.getfName()+“”+currentCourse.getlName();
SpannableString SfullName=新的SpannableString(全名);
SfullName.setSpan(新的下划线span(),0,fullName.length(),0);
holder.text\u view\u firstName\u 1.setText(SfullName);
如果(位置>上一个位置){
AnimationUtil.animate(holder,true);
}否则{
AnimationUtil.animate(holder,false);
}
先前位置=位置;
}
类ViewCourseHolder扩展了RecyclerView.ViewHolder{
私有文本视图文本\视图\名字\ 1;
ViewCourseHolder(@NonNull View itemView){
超级(项目视图);
text\u view\u firstName\u 1=itemView.findviewbyd(R.id.text\u view\u firstName\u 1);
}
}
@凌驾
public int getItemCount(){
返回super.getItemCount();
}
一切都很完美。现在我想在recyclerview中显示广告,所以我更改了适配器:

public class ViewCourseAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

private static final int COURSE_VIEW_TYPE = 0;
private static final int AD_VIEW_TYPE = 1;

private List<Course> data;
private List<Object> ad;
private Context context;
private LayoutInflater layoutInflater;

private int previousPosition = 0;

public ViewCourseAdapter(Context context, List<Object> ad) {
    this.data = new ArrayList<>();
    this.context = context;
    this.layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    this.ad = ad;
}

@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    switch (viewType ) {
        case COURSE_VIEW_TYPE:
            View courseView = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_courses_item, parent, false);
            return new ViewCourseViewHolder(courseView);
        case AD_VIEW_TYPE:
            default:
                View adView = LayoutInflater.from(parent.getContext()).inflate(R.layout.native_ads, parent, false);
                return new AdViewHolder(adView);
    }

}

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {

    int viewType = getItemViewType(position);

    switch (viewType) {
        case COURSE_VIEW_TYPE:

            ViewCourseViewHolder holder1 = (ViewCourseViewHolder) holder;
            Course currentCourse = (Course) data.get(position);

            String fullName = currentCourse.getfName() + " " + currentCourse.getlName();
            SpannableString SfullName = new SpannableString(fullName);
            SfullName.setSpan(new UnderlineSpan(), 0, fullName.length(), 0);

            holder1.text_view_firstName_1.setText(SfullName);

            break;

        case AD_VIEW_TYPE:

        default:

            AdViewHolder bannerHolder = (AdViewHolder) holder;
            AdView adView = (AdView) ad.get(position);
            ViewGroup adCardView = (ViewGroup) bannerHolder.itemView;

            if (adCardView.getChildCount() > 0) {
                adCardView.removeAllViews();
            }
            if (adView.getParent() != null) {
                ((ViewGroup) adView.getParent()).removeView(adView);
            }

            adCardView.addView(adView);
    }



    if (position > previousPosition) {
        AnimationUtil.animate(holder, true);
    } else {
        AnimationUtil.animate(holder, false);
    }

    previousPosition = position;
}

class AdViewHolder extends RecyclerView.ViewHolder {

    AdViewHolder(View view) {
        super(view);
    }
}

@Override
public int getItemViewType(int position) {
    return (position % ViewCoursesActivity.ITEMS_PER_AD == 0) ? AD_VIEW_TYPE
            : COURSE_VIEW_TYPE;
}

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

public void setData(List<Course> newData) {
    if (data != null) {
        CourseDiffCallback courseDiffCallback = new CourseDiffCallback(data, newData);
        DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(courseDiffCallback);

        data.clear();
        data.addAll(newData);
        diffResult.dispatchUpdatesTo(this);
    } else {
        data = newData;
    }


}

public class ViewCourseViewHolder extends RecyclerView.ViewHolder {

    private TextView text_view_firstName_1;

    ViewCourseViewHolder(@NonNull View itemView) {
        super(itemView);

        text_view_firstName_1 = itemView.findViewById(R.id.text_view_firstName_1);

    }

}

private class CourseDiffCallback extends DiffUtil.Callback {

    private final List<Course> oldItem, newItem;

    private CourseDiffCallback(List<Course> oldItem, List<Course> newItem) {
        this.oldItem = oldItem;
        this.newItem = newItem;
    }

    @Override
    public int getOldListSize() {
        return oldItem.size();
    }

    @Override
    public int getNewListSize() {
        return newItem.size();
    }

    @Override
    public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
        return oldItem.get(oldItemPosition).getId() == newItem.get(newItemPosition).getId();
    }

    @Override
    public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
        return oldItem.get(oldItemPosition).getfName().equals(newItem.get(newItemPosition).getfName());
    }
}
公共类ViewCourseApter扩展了RecyclerView.Adapter{
私有静态最终int课程\视图\类型=0;
私有静态最终int AD_视图_类型=1;
私人名单数据;
私人名单广告;
私人语境;
私人停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场;
private int previousPosition=0;
public ViewCourseAdapter(上下文,列表广告){
this.data=new ArrayList();
this.context=上下文;
this.layoutInflater=(layoutInflater)context.getSystemService(context.LAYOUT\u INFLATER\u SERVICE);
this.ad=ad;
}
@非空
@凌驾
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup父级,int-viewType){
开关(视图类型){
案例课程\视图\类型:
View courseView=LayoutInflater.from(parent.getContext()).flate(R.layout.View\u courses\u项目,parent,false);
返回新视图courseView文件夹(courseView);
案例广告视图类型:
违约:
View adView=LayoutInflater.from(parent.getContext()).flate(R.layout.native_ads,parent,false);
返回新的AdviewWholder(adView);
}
}
@凌驾
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder,int位置){
int viewType=getItemViewType(位置);
开关(视图类型){
案例课程\视图\类型:
ViewCourseView文件夹持有者1=(ViewCourseView文件夹)持有者;
课程当前课程=(课程)数据。获取(位置);
字符串fullName=currentCourse.getfName()+“”+currentCourse.getlName();
SpannableString SfullName=新的SpannableString(全名);
SfullName.setSpan(新的下划线span(),0,fullName.length(),0);
holder1.text\u view\u firstName\u 1.setText(SfullName);
打破
案例广告视图类型:
违约:
AdViewHolder横幅持有人=(AdViewHolder)持有人;
AdView AdView=(AdView)ad.get(position);
ViewGroup adCardView=(ViewGroup)bannerHolder.itemView;
如果(adCardView.getChildCount()>0){
adCardView.RemoveAllView();
}
if(adView.getParent()!=null){
((ViewGroup)adView.getParent()).removeView(adView);
}
adcardwiew.addView(adView);
}
如果(位置>上一个位置){
AnimationUtil.animate(holder,true);
}否则{
AnimationUtil.animate(holder,false);
}
先前位置=位置;
}
类AdViewHolder扩展了RecyclerView.ViewHolder{
AdvieWolder(视图){
超级(视图);
}
}
@凌驾
public int getItemViewType(int位置){
返回(位置%ViewCoursesActivity.ITEMS\u PER\u AD==0)?AD\u视图\u类型
:课程\视图\类型;
}
@凌驾
public int getItemCount(){
返回data.size();
}
公共void setData(列出新数据){
如果(数据!=null){
CourseDiffCallback CourseDiffCallback=新CourseDiffCallback(数据,新数据);
DiffUtil.diffesult diffesult=DiffUtil.calculateDiff(courseDiffCallback);
data.clear();
data.addAll(newData);
diffResult.dispatchUpdatesTo(本);
}否则{
数据=新数据;
}
}
公共类ViewCourseViewHolder扩展了RecyclerView.ViewHolder{
私有文本视图文本\视图\名字\ 1;
ViewCourseView文件夹(@NonNull视图项视图){
超级(项目视图);
text\u view\u firstName\u 1=itemView.findviewbyd(R.id.text\u view\u firstName\u 1);
}
}
私有类CourseDiffCallback扩展了DiffUtil.Callback{
私有最终列表oldItem、newItem;
private CourseDiffCallback(列出旧项,列出新项){
this.oldItem=oldItem;
this.newItem=newItem;
}
@凌驾
public int getOldListSize(){
返回oldItem.size();
}
@凌驾
public int getNewListSize(){
返回newItem.size();
}
@凌驾
公共布尔值areItemsTheSame(int-oldItemPosition,int-newItemPosition){
返回oldItem.get(oldItemPosition).getId()==
public class ViewCoursesActivity extends AppCompatActivity {

private CourseViewModel courseViewModel;

// A banner ad is placed in every 8th position in the RecyclerView.
public static final int ITEMS_PER_AD = 8;

private static final String AD_UNIT_ID = "ca-app-pub-3940256099942544/6300978111";

// The RecyclerView that holds and displays banner ads and menu items.
private RecyclerView recyclerView;

// List of banner ads and MenuItems that populate the RecyclerView.
private List<Object> data = new ArrayList<>();

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

    recyclerView = findViewById(R.id.recycler_view_3);
    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));

    addBannerAds();
    loadBannerAds();

    final ViewCourseAdapter adapter = new ViewCourseAdapter(this, data);
    recyclerView.setAdapter(adapter);

    courseViewModel = ViewModelProviders.of(this).get(CourseViewModel.class);
    courseViewModel.setIdForCourse(0);
    //courseViewModel.getCourseByStudentId().observe(this, adapter::submitList);
    courseViewModel.getCourseByStudentId().observe(this, adapter::setData);

}

@Override
protected void onResume() {
    for (Object item : data) {
        if (item instanceof AdView) {
            AdView adView = (AdView) item;
            adView.resume();
        }
    }
    super.onResume();
}

@Override
protected void onPause() {
    for (Object item : data) {
        if (item instanceof AdView) {
            AdView adView = (AdView) item;
            adView.pause();
        }
    }
    super.onPause();
}

@Override
protected void onDestroy() {
    for (Object item : data) {
        if (item instanceof AdView) {
            AdView adView = (AdView) item;
            adView.destroy();
        }
    }
    super.onDestroy();
}

/**
 * Adds banner ads to the items list.
 */
private void addBannerAds() {
    // Loop through the items array and place a new banner ad in every ith position in
    // the items List.
    for (int i = 0; i <= data.size(); i += ITEMS_PER_AD) {
        final AdView adView = new AdView(ViewCoursesActivity.this);
        adView.setAdSize(AdSize.SMART_BANNER);
        adView.setAdUnitId(AD_UNIT_ID);
        data.add(i, adView);
    }
}

/**
 * Sets up and loads the banner ads.
 */
private void loadBannerAds() {
    // Load the first banner ad in the items list (subsequent ads will be loaded automatically
    // in sequence).
    loadBannerAd(0);
}

/**
 * Loads the banner ads in the items list.
 */
private void loadBannerAd(final int index) {

    if (index >= data.size()) {
        return;
    }

    Object item = data.get(index);
    if (!(item instanceof AdView)) {
        throw new ClassCastException("Expected item at index " + index + " to be a banner ad"
                + " ad.");
    }

    final AdView adView = (AdView) item;

    // Set an AdListener on the AdView to wait for the previous banner ad
    // to finish loading before loading the next ad in the items list.
    adView.setAdListener(new AdListener() {
        @Override
        public void onAdLoaded() {
            super.onAdLoaded();
            // The previous banner ad loaded successfully, call this method again to
            // load the next ad in the items list.
            loadBannerAd(index + ITEMS_PER_AD);
        }

        @Override
        public void onAdFailedToLoad(int errorCode) {
            // The previous banner ad failed to load. Call this method again to load
            // the next ad in the items list.
            Log.e("ViewCoursesActivity", "The previous banner ad failed to load. Attempting to"
                    + " load the next banner ad in the items list.");
            loadBannerAd(index + ITEMS_PER_AD);
        }
    });

    // Load the banner ad.
    adView.loadAd(new AdRequest.Builder().build());
}
while (data.size() > 0) {
        collated.addAll(ad);
        for (int i = 0; i < ITEMS_PER_AD && data.size() > 0; ++i) {
            collated.add(data.remove(0));
        }
}
ad.remove(0);
return collated;
private List<Course> data;
private List<Object> ad;
private static List<Object> collate(List<Course> data, List<Object> ads) {
    List<Object> collated = new ArrayList<>();

    while (data.size() > 0 || ads.size() > 0) {
        for (int i = 0; i < ITEMS_PER_AD && data.size() > 0; ++i) {
            collated.add(data.remove(0));
        }

        if (ads.size() > 0) {
            collated.add(ads.remove(0));
        }
    }

    return collated;
}
private List<Course> data;
private List<Object> ad;
// ...

public ViewCourseAdapter(Context context, List<Object> ad) {
    this.data = new ArrayList<>();
    this.ad = ad;
    // ...
}
private List<Object> ad;
private List<Object> collated;
// ...

public ViewCourseAdapter(Context context, List<Object> ad) {
    this.ad = ad;
    this.collated = new ArrayList<>(ad);
    // ...
}
public void setData(List<Course> newData) {
    if (data != null) {
        CourseDiffCallback courseDiffCallback = new CourseDiffCallback(data, newData);
        DiffUtil.DiffResult diffResult = DiffUtil.calculateDiff(courseDiffCallback);

        data.clear();
        data.addAll(newData);
        diffResult.dispatchUpdatesTo(this);
    } else {
        data = newData;
    }
}
public void setData(List<Course> newData) {
    if (data != null) {
        List<Object> newCollated = collate(ad, newData);
        // setup DiffUtil callback here...

        this.collated = newCollated;
        // dispatch DiffUtil result here...
    }
}
@Override
public int getItemCount() {
    return collated.size();
}
@Override
public int getItemViewType(int position) {
    return (collated.get(position) instanceof Course) 
            ? COURSE_VIEW_TYPE
            : AD_VIEW_TYPE;
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
    if (holder.getItemViewType() == COURSE_VIEW_TYPE) {
        bindCourseHolder((ViewCourseViewHolder) holder, position);
    } else if (holder.getItemViewType() == AD_VIEW_TYPE) {
        bindAdHolder((AdViewHolder) holder, position);
    }
}

private void bindCourseHolder(ViewCourseViewHolder holder, int position) {
    // ...
}

private void bindAdHolder(AdViewHolder holder, int position) {
    // ...
}