ADS в RecyclerView не отображаются правильно - PullRequest
0 голосов
/ 03 октября 2018

Друзья, помогите пожалуйста.Я делаю RecyclerView с рекламой.Список не отображается правильно.Когда встраивается реклама, нарушайте список последовательностей.На скриншоте я привожу пример.

Список в настоящее время отображается неправильно.Элемент 10 не отображается: enter image description here

Мне нужно, чтобы элемент 10 отображался, как на этом снимке экрана: enter image description here

Мой адаптеркод:

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

    private List<Card> scheduleList;
    private static final int CONTENT = 0;
    private static final int AD = 1;


    public class MyViewHolder extends RecyclerView.ViewHolder {
        public TextView textDate;
        public TextView textSubject;
        public Button share;

        public MyViewHolder(View view) {
            super(view);
            textDate = view.findViewById(R.id.textDate);
            textSubject = view.findViewById(R.id.textSubject);
            share = view.findViewById(R.id.shareBtn);

            Typeface custom_font = Typeface.createFromAsset(view.getContext().getAssets(),  "Exo2Light.ttf");

            textDate.setTypeface(custom_font);
            textSubject.setTypeface(custom_font);
        }
    }

    public static class ViewHolderAdMob extends RecyclerView.ViewHolder {
        public AdView mAdView;
        public ViewHolderAdMob(View view) {
            super(view);
            mAdView = view.findViewById(R.id.adView);
        }
    }

    public ScheduleAdapter(List<Card> scheduleList) {
        this.scheduleList = scheduleList;
    }


    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        RecyclerView.ViewHolder viewHolder = null;
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        if (viewType == CONTENT) {
            View v = inflater.inflate(R.layout.recycler_item, parent, false);
            viewHolder = new MyViewHolder(v);
        } else {
            View v = inflater.inflate(R.layout.recycler_item_admob, parent, false);
            viewHolder = new ViewHolderAdMob(v);
        }
        return viewHolder;
    }



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

        if (getItemViewType(position) == CONTENT) {

            MyViewHolder viewHolder = (MyViewHolder) holder;
            Card card = scheduleList.get(position);
            viewHolder.textDate.setText(card.getDateline());

            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
                viewHolder.textSubject.setText(Html.fromHtml(card.getContentline(), Html.FROM_HTML_MODE_COMPACT));
            else
                viewHolder.textSubject.setText(Html.fromHtml(card.getContentline()));

            ((MyViewHolder) holder).share.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    // handle your click here.
                    Intent sharingIntent = new Intent(Intent.ACTION_SEND);
                    sharingIntent.setType("text/plain");
                    sharingIntent.putExtra(Intent.EXTRA_TEXT, "\uD83D\uDCC5 " + ((MyViewHolder) holder).textDate.getText().toString()+"\r\n"+((MyViewHolder) holder).textSubject.getText().toString());
                    v.getContext().startActivity(Intent.createChooser(sharingIntent,"Поділитися..."));
                } });
        } else {

            AdRequest adRequest = new AdRequest.Builder()
                    //.addTestDevice("B86C95B89D21A5F8E2C22F0D94470A13")
                    .build();

            ((ViewHolderAdMob) holder).mAdView.setAdListener(new AdListener() {
                @Override
                public void onAdLoaded() {
                    super.onAdLoaded();
                    ((ViewHolderAdMob) holder).mAdView.setVisibility(View.VISIBLE);
                }

                @Override
                public void onAdFailedToLoad(int errorCode) {
                    super.onAdFailedToLoad(errorCode);
                    ((ViewHolderAdMob) holder).mAdView.setVisibility(View.GONE);
                }
            });
            ((ViewHolderAdMob) holder).mAdView.loadAd(adRequest);
        }

    }


    @Override
    public int getItemViewType(int position) {

        if (position == 10) {
            return AD;
        }
        return CONTENT;
    }


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

1 Ответ

0 голосов
/ 03 октября 2018

Замените ваш код на

    @Override
    public int getItemCount() {
       return scheduleList.size() + 1;
    }

и используйте эту функцию, чтобы получить объект Card в onBindViewHolder

    public Card getItem(int position) {
       if(position > 10){
           return scheduleList.get(position - 1)
       }else{
            return scheduleList.get(position)
       }
    }

Добавив 1 в getItemCount () функция, мы делаем адаптер для рисования еще одной линии, которая представляет рекламу.

И, конечно, у нас нет IndexOutOfBoundsException для 13-й строки путем уменьшения позиции на минус один для значений, которыебольше 10 в getItem (int position) функция.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...