我正在尝试解决一个小问题,即当我在适配器中每 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