向适配器添加更多视图的正确方法



我正在尝试解决一个小问题,即当我在适配器中每 6 个项目使用原生广告时(如下所示),并且我从 Firebase 检索数据,问题是每 6 个帖子缺少一个帖子,那是因为它被广告取代了。

这是我从Firebase检索帖子的代码:

mDatabasePosts.addValueEventListener(new ValueEventListener() {
                    @Override public void onDataChange(DataSnapshot dataSnapshot) {
                        for (DataSnapshot dataSnapshot2 : dataSnapshot.getChildren()){
                            model_class value = dataSnapshot2.getValue(model_class.class);
                            //I think the solution should be here
                            mPosts_List.add(value);
                            //I think the solution should be here
                            mPosts_Adapter.notifyDataSetChanged();
                        }
                    }
                    @Override public void onCancelled(DatabaseError databaseError) {}});

这是我的适配器:

@Override public int getItemCount() {
    return mPosts_List.size();
}
@Override public int getItemViewType(int position) {
    if (position == 0){return Head_View;}
    else if (position % 6 == 0){return Ads_View;}
    return Posts_View;
}
@Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
    switch (viewType) {
        case Head_View:
            View HEADER_VIEW = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.head_handler_view, viewGroup, false);
            return new HEAD_View_Holder(HEADER_VIEW);
        case Posts_View:
            View POSTS_VIEW = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.posts_handler_view, viewGroup, false);
            return new posts_handler(POSTS_VIEW);
        case Ads_View:default:View AD_VIEW = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.admob_handler_view, viewGroup, false);
            return new admob_handler(AD_VIEW);}
}

@Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    int viewType = getItemViewType(position);
    switch (viewType) {
        case Head_View:final HEAD_View_Holder User_Holder = (HEAD_View_Holder) holder;
            User_Holder.add_post_handler(FirebaseDatabase.getInstance().getReference().child("users").child(FirebaseAuth.getInstance().getCurrentUser().getUid()));break;
        case Posts_View:
            posts_handler_b Normal_Holder = (posts_handler_b) holder;
            retrieve_data model = mPosts_List.get(position);Normal_Holder.Card_View_Time(model.getH());
            Normal_Holder.Card_View_Handler(model.getK(),position);break;
        case Ads_View:default:
            admob_handler Ads_Holder = (admob_handler) holder;
            Ads_Holder.Show_ADS();
  }
}

因此,请任何人给我解决方案,例如每 6 个位置复制一次帖子以显示它们,或者如果有简单的解决方案......所以请帮助我兄弟们。

问题可能是,当您绑定帖子视图时,您会获得给定位置的数据。

您应该递减索引,以免在数据数组中每 6 个项目跳转与广告观看对应的位置。

类似的东西

case Posts_View:
        posts_handler_b Normal_Holder = (posts_handler_b) holder;
        retrieve_data model = mPosts_List.get(position - (position / 6) - 1);
        Normal_Holder.Card_View_Time(model.getH());
        Normal_Holder.Card_View_Handler(model.getK(),position);break;

您需要增加每个添加的项目计数。

@Override public int getItemCount() {
   return mPosts_List.isEmpty() ? 0 : mPosts_List.size() + (mPosts_List.size() / 6) + 1;
}

如果您的头视图不代表您的数据,还添加了 +1。

更新

@Override public retrieve_data getItemAtPosition(int position) {
   return mPost_List.get(position - (position / 6) - 1)
}

您需要在onBindHolder中使用此方法来检索数据。

retrieve_data model = mPosts_List.get(position)

替换为

retrieve_data model = getItemAtPosition(position)

问题是您没有考虑到通过在mPosts_List中的项目之间插入视图来onBindViewHolder()给出的position中产生的差异。

解决此问题的最简单方法是在具有Posts_View视图类型时调整position值。

case Post_View:
    int adjustedPosition = position - (position / 6) - 1

最新更新