首页 > 解决方案 > RecyclerView 中的多个查看器跳过项目

问题描述

我有一个适配器负责从我的本地数据库中读取并显示一些卡片视图,昨天我在组合中添加了另一个视图来处理 admob 广告。但它添加了一个添加。它跳过了我的一个数据库条目。

所以我做的是这个

int TYPE_POST = 0;
int TYPE_AD = 1;
    @Override
    public int getItemViewType(int position) {
        if ((position % 5) == 0) {
            return TYPE_AD;
        }

        return  TYPE_POST;
    }

我有这个 onBindViewHolder 如果我把它改成 final dbFeed dbfeed = LemesosAdapter.get(position);final dbFeed dbfeed = LemesosAdapter.get(position+1); 一个帖子就不会被跳过。但第二次添加广告时,它将被跳过。

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

    if (getItemViewType(position) == TYPE_POST) {
        // - get element from dataset at this position
        // - replace the contents of the view with that element
        PostViewHolder postViewHolder = (PostViewHolder)holder;
        final dbFeed dbfeed = LemesosAdapter.get(position);
        //Animation by yoyo library
        YoYo.with(Techniques.BounceIn).playOn(postViewHolder.cardView);
        String description;

        description = Html.fromHtml(dbfeed.getDescription()).toString().replaceAll("\n", "").trim().substring(0, 100).replace((char) 65532, (char) 32).trim() + "...";
        postViewHolder.Title.setText(dbfeed.getTitle());
        postViewHolder.Description.setText(description);
        postViewHolder.Date.setText(dbfeed.getPubDate());
        Picasso.with(context).load(dbfeed.getThumbnailUrl()).placeholder(R.drawable.ic_image).into(postViewHolder.Thumbnail);
        postViewHolder.cardView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Intent intent = new Intent(context, NewsDetails.class);
                intent.putExtra("ThumbNail", dbfeed.getThumbnailUrl());
                intent.putExtra("Link", dbfeed.getThumbnailUrl());
                intent.putExtra("Title", dbfeed.getTitle());
                intent.putExtra("Description", dbfeed.getDescription());
                intent.putExtra("Date", dbfeed.getPubDate());
                context.startActivity(intent);

            }
        });


    } else if (getItemViewType(position) == TYPE_AD ) {


    }

}

最后是我的 getItemCount 。在这里,我认为解决方案就在这里。我在另一篇文章的这一面看到我应该做与我开始的模态相同的模态 ((itemcount %5) + itemcount) 但它不起作用

    @Override
    public int getItemCount() {
        return ((LemesosAdapter.size()%5))+LemesosAdapter.size() ;
    }
}

我在这里想念什么?

标签: androidandroid-recyclerview

解决方案


如我所见,每次出现广告时,它都会跳过您的一个项目,因为帖子和广告共享相同的位置。您可以在这些 if-else 条件之外通过 Log 进行检查。

if (getItemViewType(position) == TYPE_POST) {
    // - get element from dataset at this position
    // - replace the contents of the view with that element
    PostViewHolder postViewHolder = (PostViewHolder)holder;
    final dbFeed dbfeed = LemesosAdapter.get(position - count);
    //Animation by yoyo library
    YoYo.with(Techniques.BounceIn).playOn(postViewHolder.cardView);
    String description;

    description = Html.fromHtml(dbfeed.getDescription()).toString().replaceAll("\n", "").trim().substring(0, 100).replace((char) 65532, (char) 32).trim() + "...";
    postViewHolder.Title.setText(dbfeed.getTitle());
    postViewHolder.Description.setText(description);
    postViewHolder.Date.setText(dbfeed.getPubDate());
    Picasso.with(context).load(dbfeed.getThumbnailUrl()).placeholder(R.drawable.ic_image).into(postViewHolder.Thumbnail);
    postViewHolder.cardView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            Intent intent = new Intent(context, NewsDetails.class);
            intent.putExtra("ThumbNail", dbfeed.getThumbnailUrl());
            intent.putExtra("Link", dbfeed.getThumbnailUrl());
            intent.putExtra("Title", dbfeed.getTitle());
            intent.putExtra("Description", dbfeed.getDescription());
            intent.putExtra("Date", dbfeed.getPubDate());
            context.startActivity(intent);

        }
    });


} else if (getItemViewType(position) == TYPE_AD ) {
    count += 1
}

推荐阅读