gpt4 book ai didi

android - 在 RecyclerView 中显示原生广告

转载 作者:行者123 更新时间:2023-12-04 23:53:43 26 4
gpt4 key购买 nike

我正在使用 RecyclerView。其中我必须在 GridLayout Manager 中显示两个项目,并且跨度计数为 2 以显示全宽的原生广告。谁能帮我。 Output coming like image 1

Actual Output I need like image 2

最佳答案

2022 年 7 月更新
The Sample Project已更新到最新的依赖项。
有人还问“如果我想在运行时根据用户选择来交换布局管理器怎么办?”没问题,check the updated branch .没有魔法。
原始答案
我想我找到了一个可能对你有用的解决方案。我在这里使用 Kotlin,但我确信在 Java 中也可以实现。
假设

  • 您正在使用 GridLayoutManager
  • 您想每 N 个项目插入一个“广告”。
  • 您已经实现或有方法来确定您正在显示的数据类型(又名:您根据 itemType 膨胀不同的“ViewHolders”。
  • 您在不可变数据列表中插入占位符没有问题,因此您的 RecyclerView 适配器不会充满疯狂的逻辑,而且您的 GridLayout 也不必是自定义的。

  • 如何?
  • 网格布局管理器根据“跨度”的数量计算布局/度量(我在心理上将其称为列,即使这并不真正意味着)。
  • 当你创建一个 GridLayoutManager 时,你这样做,通过提供跨度数说布局将跨越(lol?)
  • 可以更改 View 在网格中布局时将跨越的跨度数(?)。默认情况下, View 将跨越一个跨度(已经足够了)。

  • “跨度”这个词就够了……
    假设你有一个 List<Thing>作为您的数据源。
    你有 0..n 个东西。
    Thing具有按类型标识的方法。又名: aThing.type .
    假设你有两种类型:
    正常和AD。
    enum Type { Normal, AD }
    (例如)。
    所以你可以这样做:
    if (thing.type == Type.AD)
    现在我假设你收到了 Thing 的列表。从您的存储库中。
    您有不同的选择(我将只探索一个,并将其他作为练习留给读者,主要是因为我没有那么多时间,但也因为每个最佳解决方案都将真正取决于上下文。我不这里有很多上下文)。我的要求很简单:让广告跨越所有网格。
    一个简单的解决方案涉及改变存储库为您提供的结果列表(请注意,我不会触摸存储库的数据,制作副本,将副本用于适配器)。
    因此,当您获取列表时,不要将其直接发送到适配器,而是对其进行修改:
    (这是伪代码,假设 listOfData 是您要显示的数据,当然已经填充)
    var newList = ArrayList<Thing>()

    for ((index, thing) in listOfData.withIndex()) {
    // if it's an Ad, insert one, and continue adding items
    if (index % 4 == 0) {
    newList.add(AdPlaceholder())
    } else {
    newList.add(thing)
    }
    }

    return newList
    因此,我们根据原始列表返回一个 newList(这只是一种实现方式,不是唯一的,当然也不是所有情况下最好的,可能远不止眼前所见)。
    什么是 AdPlaceholder() ?
    它只是一个专门的“东西”:)(见下文)。
    现在在您的 Activity/fragment 中的某个地方,您可能会像这样设置您的回收站 View :(再次,伪代码,但有效的 Kotlin)
     override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    layoutManager = GridLayoutManager(this, 2)
    mainRecyclerView.layoutManager = layoutManager
    mainRecyclerView.adapter = YourAdapter()

    // and somewhere you'll send data to this adapter...
    adapter.submitList(repository.getMyListOfThings())
    }

    这看起来像您的初始网格。
    现在,起初,我想,如果我们创建一个自定义的 LayoutManager,它可以“智能”地了解何时显示广告等等。
    但后来我发现 GridLayoutManager 智能地公开了一个值(并且它有效):

    spanSizeLookup: Sets the source to get the number of spans occupied by each item in the adapter.


    这正是我们需要的,告诉 Grid:嘿,这个项目占用 N 个跨度,但另一个项目占用 Y。
    所以,我添加了这个:
    layoutManager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
    override fun getSpanSize(position: Int): Int {
    return when (adapter.getItemViewType(position)) {
    adapter.normalViewType -> 1
    adapter.adViewType -> 2
    else -> 1 //default
    }
    }
    }
    瞧!
    由于要处理的内容很多,我创建了 a sample project这表明了这一点。它有一个错误,希望你能发现它(并修复它!):)
    注意我没有使用任何广告加载库,这取决于你。请记住,广告通常以 WebView 的形式实现,因此往往很慢、异步等。准备好在广告尚未加载时显示占位符等。
    这真的取决于你如何实现这方面的事情,天空才是极限。这只是我为测试我的理论而构建的一个简单示例。
    我个人认为这会更难。我证明自己错了。
    祝你好运。

    关于android - 在 RecyclerView 中显示原生广告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56525682/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com