Почему мои рекламные баннеры Recyclerview удаляют ненужные предметы и дублируются при нажатии на них? - PullRequest
0 голосов
/ 24 марта 2020

Если мой пост выглядит очень неорганизованным, пожалуйста, поймите, потому что я не публиковал здесь ранее. Если что-то отсутствует, дайте мне знать, чтобы я мог добавить его соответственно.

Я пробовал разные подходы здесь и в Google, но реклама либо удаляет элемент в программе утилизации (например, у меня есть пять городов до размещения рекламы, но когда я добавляю добавление после каждых трех элементов, город, который должен быть в третья позиция исчезает и заменяется надстройкой, после чего, когда я обновляю sh список, объявления становятся двумя рядом друг с другом). Я хотел бы попросить вас экспертов взглянуть на мой класс адаптера и порекомендовать, как я должен размещать рекламу после каждых трех пунктов повторного просмотра:

Ниже мой адаптер. Я использую этот пример

import android.content.Context;
import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;
import android.widget.Filter;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.recyclerview.widget.RecyclerView;


import java.util.ArrayList;


public class AdapterCity extends RecyclerView.Adapter<AdapterCity.MyViewHolder> {

    private ArrayList<ItemCity> arraylist;
    private ArrayList<ItemCity> filteredArrayList;
    private NameFilter filter;
    private CityClickListener cityClickListener;
    private Methods methods;
    private SharedPref sharedPref;

    public AdapterCity(Context context, ArrayList<ItemCity> list, CityClickListener cityClickListener) {
        this.arraylist = list;
        this.filteredArrayList = list;
        this.cityClickListener = cityClickListener;
        methods = new Methods(context, interAdListener);
        sharedPref = new SharedPref(context);
    }

    class MyViewHolder extends RecyclerView.ViewHolder {

        private TextView textView_title;
        private ConstraintLayout ll;


        private MyViewHolder(View view) {
            super(view);
            ll = view.findViewById(R.id.ll);
            textView_title = view.findViewById(R.id.textView_cityname);
        }
    }

    @NonNull
    @Override
    public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.layout_citylist, parent, false);

        return new MyViewHolder(itemView);

    }

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

        holder.textView_title.setText(arraylist.get(position).getName());

        holder.ll.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                methods.showInter(holder.getAdapterPosition(), "");
            }
        });
    }

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

    @Override
    public long getItemId(int position) {
        return position;
    }


    @Override
    public int getItemViewType(int position) {
        return 0;
    }

    private String getID(int pos) {
        return arraylist.get(pos).getId();
    }

    public Filter getFilter() {
        if (filter == null) {
            filter = new NameFilter();
        }
        return filter;
    }

    private class NameFilter extends Filter {

        @Override
        protected FilterResults performFiltering(CharSequence constraint) {

            constraint = constraint.toString().toLowerCase();
            FilterResults result = new FilterResults();
            if (constraint.toString().length() > 0) {
                ArrayList<ItemCity> filteredItems = new ArrayList<>();

                for (int i = 0, l = filteredArrayList.size(); i < l; i++) {
                    String nameList = filteredArrayList.get(i).getName();
                    if (nameList.toLowerCase().contains(constraint))
                        filteredItems.add(filteredArrayList.get(i));
                }
                result.count = filteredItems.size();
                result.values = filteredItems;
            } else {
                synchronized (this) {
                    result.values = filteredArrayList;
                    result.count = filteredArrayList.size();
                }
            }
            return result;
        }

        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint,
                                      FilterResults results) {

            arraylist = (ArrayList<ItemCity>) results.values;
            notifyDataSetChanged();
        }
    }

    private void loadCityRadio(int pos) {
        int reali = getPosition(getID(pos));
        Constants.itemCity = arraylist.get(reali);
        cityClickListener.onClick();
    }

    private int getPosition(String id) {
        int count = 0;
        int rid = Integer.parseInt(id);
        for (int i = 0; i < arraylist.size(); i++) {
            try {
                if (rid == Integer.parseInt(arraylist.get(i).getId())) {
                    count = i;
                    break;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return count;
    }

    private InterAdListener interAdListener = new InterAdListener() {
        @Override
        public void onClick(int position, String type) {
            loadCityRadio(position);
        }
    };
}

Ниже приведен мой класс ItemCity, используемый для получения идентификатора и имени города

public class ItemCity {

    private String id;
    private String name;

    public ItemCity(String id, String name, String tagLine) {
        this.id = id;
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public String getName() {
        return name;
    }


}

Это последняя версия моего класса Adapter, плохо размещает рекламу в моем репортере

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Filter;
import android.widget.LinearLayout;
import android.widget.TextView;

import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.recyclerview.widget.RecyclerView;

import com.google.android.gms.ads.AdRequest;
import java.util.ArrayList;


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

    private ArrayList<ItemCity> arraylist;
    private ArrayList<ItemCity> filteredArrayList;
    private NameFilter filter;
    private CityClickListener cityClickListener;
    private Methods methods;
    private SharedPref sharedPref;


    /*Added for Ads*/
    private static final int MENU_ITEM_VIEW_TYPE = 0;
    private static final int BANNER_AD_VIEW_TYPE = 1;


    public AdapterCityTestAds (Context context, ArrayList<ItemCity> list, CityClickListener cityClickListener) {
        this.arraylist = list;
        this.filteredArrayList = list;
        this.cityClickListener = cityClickListener;
        methods = new Methods(context, interAdListener);
        sharedPref = new SharedPref(context);
    }

    class MenuItemViewHolder extends RecyclerView.ViewHolder {

        private TextView textView_title;
        private ConstraintLayout ll;

        private MenuItemViewHolder(View view) {
            super(view);
            ll = view.findViewById(R.id.ll);
            textView_title = view.findViewById(R.id.textView_cityname);

        }
    }
    public class AdViewHolder extends RecyclerView.ViewHolder {

        private LinearLayout ll_adView;
        AdViewHolder(View view) {
            super(view);
            ll_adView = view.findViewById(R.id.ll_adView);
        }
    }

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

    /**
     * Determines the view type for the given position.
     */
    @Override
    public int getItemViewType(int position) {
        return (position % Constants.ADSINLISTITEM == 0) ? BANNER_AD_VIEW_TYPE
                : MENU_ITEM_VIEW_TYPE;
    }


    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
        switch (viewType) {
            case MENU_ITEM_VIEW_TYPE:
                View menuItemLayoutView = LayoutInflater.from(viewGroup.getContext()).inflate(
                        R.layout.layout_citylist, viewGroup, false);
                return new MenuItemViewHolder(menuItemLayoutView);
            case BANNER_AD_VIEW_TYPE:
                // fall through
            default:
                View addView = LayoutInflater.from(viewGroup.getContext())
                        .inflate(R.layout.banner_ad_container, viewGroup, false);
                return new AdViewHolder(addView);
        }
    }


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

        int viewType = getItemViewType(position);
        switch (viewType) {
            case MENU_ITEM_VIEW_TYPE:
                MenuItemViewHolder menuItemHolder = (MenuItemViewHolder) holder;
                ItemCity itemCity = (ItemCity) arraylist.get(position);
                menuItemHolder.textView_title.setText(itemCity.getName());

                menuItemHolder.ll.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                       methods.showInter((position), "");

                    }
                });
                break;
            case BANNER_AD_VIEW_TYPE:
                // fall through
            default:
                AdViewHolder bannerHolder = (AdViewHolder) holder;
                //AdView adView = (AdView) arraylist.get(position);
                //ViewGroup adCardView = (ViewGroup) bannerHolder.itemView;
                AdRequest adRequest = new AdRequest.Builder().build();

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

                // Add the banner ad to the ad view.
                    methods.showLargeBannerAd(bannerHolder.ll_adView);
                }


        }



    @Override
    public long getItemId(int position) {
        return position;
    }



    private String getID(int pos) {
        return arraylist.get(pos).getId();
    }

    public Filter getFilter() {
        if (filter == null) {
            filter = new NameFilter();
        }
        return filter;
    }

    private class NameFilter extends Filter {

        @Override
        protected FilterResults performFiltering(CharSequence constraint) {

            constraint = constraint.toString().toLowerCase();
            FilterResults result = new FilterResults();
            if (constraint.toString().length() > 0) {
                ArrayList<ItemCity> filteredItems = new ArrayList<>();

                for (int i = 0, l = filteredArrayList.size(); i < l; i++) {
                    String nameList = filteredArrayList.get(i).getName();
                    if (nameList.toLowerCase().contains(constraint))
                        filteredItems.add(filteredArrayList.get(i));
                }
                result.count = filteredItems.size();
                result.values = filteredItems;
            } else {
                synchronized (this) {
                    result.values = filteredArrayList;
                    result.count = filteredArrayList.size();
                }
            }
            return result;
        }

        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint,
                                      FilterResults results) {

            arraylist = (ArrayList<ItemCity>) results.values;
            notifyDataSetChanged();
        }
    }

    private void loadCityRadio(int pos) {
        int reali = getPosition(getID(pos));
        Constants.itemCity = arraylist.get(reali);
        cityClickListener.onClick();
    }

    private int getPosition(String id) {
        int count = 0;
        int rid = Integer.parseInt(id);
        for (int i = 0; i < arraylist.size(); i++) {
            try {
                if (rid == Integer.parseInt(arraylist.get(i).getId())) {
                    count = i;
                    break;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return count;
    }

    private InterAdListener interAdListener = new InterAdListener() {
        @Override
        public void onClick(int position, String type) {
            loadCityRadio(position);
        }
    };
}
...