recyclerview中的广告

问题描述 投票:0回答:2

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

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();
}

而且一切都运转良好。现在,我想在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());
    }
}

我的活动是:

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());
}

此后,我有两个问题:1.在第一位置显示的是广告,而不是我的数据库中的第一项,而第一项无处。如果我检查数据库中的第一项,则不会出现在recyclerview中。2.如果我要滚动项目,则应用程序崩溃,错误是“ java.lang.IndexOutOfBoundsException:索引:8,大小:1”。我究竟做错了什么?请帮我。谢谢!

android android-recyclerview adapter ads
2个回答
0
投票

我的一个问题解决了,而且我不敢相信我花了这么长时间才弄清楚……正如Sanjay Kumar所说,列表广告只有一项,因此ad.get(position)给出IndexOutOfBoundsException错误。解决方法非常简单。在适配器中,我替换为:


0
投票

基本而言,RecyclerView用于向用户显示List。用它来指导您的实施。

© www.soinside.com 2019 - 2024. All rights reserved.