gpt4 book ai didi

android - 带分页库的无尽 RecyclerView 中的 AdMob 广告

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

我正在使用paging library为了从服务器获取数据,我正在考虑每 10 个项目后显示广告。因此,当用户向下滚动时,就会获取新项目并将其添加到 PagedList 中。我希望新广告能够加载并添加到 RecyclerView 中,就像 Instagram 在 Feed 中显示广告一样。因此,如果用户滚动到 200 个项目,将逐渐显示 20 个广告!我已经阅读了一些教程,但我还没有找到一个简单的方法来做到这一点。

这是我的适配器。

class RequestsPagedAdapter(
private val retryCallback: () -> Unit, private val from: From)
: PagedListAdapter<RequestsQuery.Request, RecyclerView.ViewHolder>(POST_COMPARATOR) {
private var networkState: NetworkState? = null

override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
when (getItemViewType(position)) {
R.layout.z_request_item -> (holder as RequestViewHolder).bind(getItem(position)!!, from)
R.layout.network_state_item -> (holder as NetworkStateItemViewHolder).bindTo(networkState)
R.layout.ad_admob_banner -> (holder as AdMobViewHolder)
}
}

override fun onBindViewHolder(
holder: RecyclerView.ViewHolder,
position: Int,
payloads: MutableList<Any>) {
if (payloads.isNotEmpty()) {
val item = getItem(position)
(holder as RequestViewHolder).updateProduct(item!!)
} else {
onBindViewHolder(holder, position)
}
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return when (viewType) {
R.layout.z_request_item -> RequestViewHolder.create(parent)
R.layout.network_state_item -> NetworkStateItemViewHolder.create(parent, retryCallback)
R.layout.ad_admob_banner -> AdMobViewHolder.create(parent)
else -> throw IllegalArgumentException("unknown view type $viewType")
}
}

private fun hasExtraRow() = networkState != null && networkState != NetworkState.LOADED

override fun getItemViewType(position: Int): Int {
return when {
hasExtraRow() && position == itemCount - 1 -> R.layout.network_state_item
position % ITEMS_PER_AD == 0 + 2 -> R.layout.ad_admob_banner
else -> R.layout.z_request_item
}
}

override fun getItemCount(): Int {
return super.getItemCount() + if (hasExtraRow()) 1 else 0
}

fun setNetworkState(newNetworkState: NetworkState?) {
val previousState = this.networkState
val hadExtraRow = hasExtraRow()
this.networkState = newNetworkState
val hasExtraRow = hasExtraRow()
if (hadExtraRow != hasExtraRow) {
if (hadExtraRow) {
notifyItemRemoved(super.getItemCount())
} else {
notifyItemInserted(super.getItemCount())
}
} else if (hasExtraRow && previousState != newNetworkState) {
notifyItemChanged(itemCount - 1)
}
}

companion object {
val POST_COMPARATOR = object : DiffUtil.ItemCallback<RequestsQuery.Request>() {
override fun areContentsTheSame(oldItem: RequestsQuery.Request, newItem: RequestsQuery.Request): Boolean =
oldItem == newItem

override fun areItemsTheSame(oldItem: RequestsQuery.Request, newItem: RequestsQuery.Request): Boolean =
oldItem.id() == newItem.id()
}
}
}

这就是数据从 Fragment 提交到 PagedList 的方式。

private fun getRequests() {
subcategoryRequestsListViewModel.requests.observe(viewLifecycleOwner, Observer {
adapter.submitList(it)
})
subcategoryRequestsListViewModel.networkState.observe(viewLifecycleOwner, Observer {
adapter.setNetworkState(it)
})
}

ViewHolder

class AdMobViewHolder(view: View) : RecyclerView.ViewHolder(view) {
companion object {
fun create(parent: ViewGroup): AdMobViewHolder {
val view = LayoutInflater.from(parent.context)
.inflate(R.layout.ad_admob_banner, parent, false)
return AdMobViewHolder(view)
}
}
}

最佳答案

没有比 google example here 更简单的例子了唯一的区别是,它从以原始格式保存的 XML 文件中获取数据,而您则从其他地方获取数据。我希望您可以根据您的需要轻松修改此示例。

关于android - 带分页库的无尽 RecyclerView 中的 AdMob 广告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56460964/

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