Recyclerview с использованием двухпозиционного элемента вторичного перекрытия - PullRequest
1 голос
/ 11 июля 2019

Я хочу показывать объявления AdMob после некоторых досок объявлений. Таким образом, я изменил мнение переработчика, чтобы использовать два держателя просмотра и показывать объявление, если позиция находится в конце уведомления. Но он показывает элемент в первом списке видов элементов доски и не может видеть первый элемент доски

Я попытался добавить первый элемент в позицию + 1, и он показывает два элемента

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
       private RecyclerView recyclerView;
       private Context context;
       private ArrayList<stTalkListContentsData> talkArrayList = new ArrayList<>();
       private ViewGroup parent;
       private int mNoticeCount = 0;

       public RecyclerAdapter(Context context, RecyclerView recyclerView, ArrayList<stTalkListContentsData> talkArrayList) {
           this.context = context;
           this.recyclerView = recyclerView;
           this.talkArrayList = talkArrayList;
       }

       public class AdViewHolder extends RecyclerView.ViewHolder {
           private AdView adView;
           AdViewHolder(View view) {
               super(view);
               adView = view.findViewById(R.id.adView);

           }
       }

       @Override
       public int getItemViewType(int position) {
           if (position == mNoticeCount) {
               return Define.AD_TYPE;
           } else {
               return Define.CONTENT_TYPE;
           }
       }
 @NonNull
        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            ViewHolder viewHolder = null;
            switch (viewType) {
                case Define.CONTENT_TYPE:
                    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_board_title_list, parent, false);
                    return new ViewHolder(v);
                case Define.AD_TYPE:
                    default:
                    View bannerAdView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_board_adview, parent, false);
                    return new AdViewHolder(bannerAdView);
            }
        }

        @Override
        public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
            int type = getItemViewType(position);
            switch (type){
                case AD_TYPE:
                    AdViewHolder bannerHolder = (AdViewHolder) holder;
                    AdView adView = ((AdViewHolder) holder).adView;
                    ViewGroup adCardView = (ViewGroup) bannerHolder.itemView;
                    if (adCardView.getChildCount() > 0) {
                        adCardView.removeAllViews();
                    }
                    if (adView.getParent() != null) {
                        ((ViewGroup) adView.getParent()).removeView(adView);
                    }
                    AdRequest adRequest =  new AdRequest.Builder().build();
                    adView.loadAd(adRequest);
                    adCardView.addView(adView);
                    break;
                case CONTENT_TYPE:{
                    stTalkListContentsData msgitem = talkArrayList.get(position);

                    JSAppNoticeContentsData talk_notice_info = msgitem.getTalkNoticeInfo();
                    JSBoardInfoData talk_board_info = msgitem.getTalkListBoardInfo();
                    ViewHolder talkholder = (ViewHolder) holder;

                   ....

                    talkholder.bind(position);
                }
                    break;
            }
        }

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

1 Ответ

1 голос
/ 11 июля 2019

Функция getItemCount () адаптера должна возвращать talkArrayList.size () + 1

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

Кроме того, в onBindViewHolder вы не можете напрямую использовать позицию для привязки данных, так как в окне реселлера хранится рекламный элемент в некоторой позиции, которой нет в talkArrayList. Если позиция перед mNoticeCount, используйте talkArrayList.get (position), чтобы получить msgItem, или используйте talkArrayList.get (position-1), то есть

 case CONTENT_TYPE:{
                stTalkListContentsData msgitem;
                    if(position < mNoticeCount ){
                msgitem = talkArrayList.get(position);
                   }else {
                msgitem = talkArrayList.get(position-1);
               }


                JSAppNoticeContentsData talk_notice_info = msgitem.getTalkNoticeInfo();
                JSBoardInfoData talk_board_info = msgitem.getTalkListBoardInfo();
                ViewHolder talkholder = (ViewHolder) holder;

               ....

                talkholder.bind(position);
            }
                break;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...