Android在每10个项目的recyclerview下方添加背景视图(如tumblr)

Android在每10个项目的recyclerview下方添加背景视图(如tumblr),android,android-recyclerview,Android,Android Recyclerview,我正在尝试创建一个类似tumblr应用程序的回收器视图。你可以在这里看到: 我的问题是如何在recyclerview下面添加视频(或任何可点击的视频)?我添加了一个项目装饰实现,如下所示: class RecyclerViewAdItemDecoration(private val func:() -> Unit) : RecyclerView.ItemDecoration() { override fun getItemOffsets(outRect: Rect, view: Vi

我正在尝试创建一个类似tumblr应用程序的回收器视图。你可以在这里看到:

我的问题是如何在recyclerview下面添加视频(或任何可点击的视频)?我添加了一个项目装饰实现,如下所示:

class RecyclerViewAdItemDecoration(private val func:() -> Unit) : RecyclerView.ItemDecoration() {

  override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: RecyclerView.State) {
    super.getItemOffsets(outRect, view, parent, state)
    val position = parent.getChildLayoutPosition(view)

    val mLayoutManager = parent.layoutManager
    if (mLayoutManager is GridLayoutManager) {
      setGridParams(view, position, parent)
    } else if (mLayoutManager is LinearLayoutManager) {
      setLinearParams(view, position, parent)
    }
  }

  private fun setGridParams(view: View, position: Int, parent: RecyclerView) {
    val p = view.layoutParams as ViewGroup.MarginLayoutParams
    if (position == 0) {
      p.setMargins(0,0,0, 0)
    } else if (position >= 10 && (position % 10 == 0 || position % 11 == 0)) {
      p.setMargins(0,0,0, parent.height)
      func()
    } else {
      p.setMargins(0,0,0, 0)
    }
  }

  private fun setLinearParams(view: View, position: Int, parent: RecyclerView) {
    val p = view.layoutParams as ViewGroup.MarginLayoutParams
    if (position == 0) {
      p.setMargins(0,0,0, 0)
    } else if (position >= 10 && (position % 10 == 0)) {
      p.setMargins(0,0,0, parent.height)
      func()
    } else {
      p.setMargins(0,0,0, 0)
    }
  }
}
这样我可以为背景视图添加足够的空间,但现在无法单击。我也找不到任何用于这种实现的库。谢谢你的帮助

编辑: 为了澄清这一点,我想在“回收者”视图中的每10件物品之后显示背景视频(或任何视图)。正如链接中的视频所示,回收器视图中每10个项目之间都有一个空格,这也会触发在后台播放视频(在回收器视图下方)

在中每10项之后显示背景视频(或任何视图) 回收者视图

如果背景视频在每10个项目之后,表示有一个项目(第11个)是透明的。

你真正想要的是


活动_main.xml
使用
相对视图
,它允许放置视图 位于其他的顶部(在Z轴上)

例如:
RecyclerView
是这里最顶层的视图

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:focusable="true">

    <View
        android:id="@+id/ad"
        android:background="@color/colorAccent"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/rv_posts"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />

</RelativeLayout>
RvAdapter.kt

class MainActivity : AppCompatActivity(), RvAdpater.OnItemClick {

    private lateinit var adView: View
    private lateinit var rvPosts: RecyclerView

    override fun onClick() {
        bringAdFront()
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        rvPosts = findViewById(R.id.rv_posts)
        rvPosts.layoutManager = LinearLayoutManager(this)

        val rvAdpater = RvAdpater()
        rvAdpater.setListener(this)
        rvPosts.adapter = rvAdpater
    }

    private fun bringAdFront() {

        adView = findViewById<View>(R.id.ad)
        adView.bringToFront()
    }

    override fun onBackPressed() {
        // to go back to the normal recycler view when back button is pressed
        val parent = rvPosts.parent as ViewGroup
        parent.removeAllViews()
        parent.addView(adView, 0)
        parent.addView(rvPosts, 1)
    }
}
const val TAG = "RvAdpater"

class RvAdpater : RecyclerView.Adapter<RecyclerView.ViewHolder>() {

    private lateinit var listener:OnItemClick


    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        val viewNormal = LayoutInflater.from(parent.context).inflate(R.layout.item_normal, parent, false)
        val viewTransparent = LayoutInflater.from(parent.context).inflate(R.layout.item_transparent, parent, false)

        return when(viewType){
            0 -> NormalViewHolder(viewNormal)
            2 -> TransparentViewHolder(viewTransparent)
            else -> NormalViewHolder(viewNormal)
        }

    }

    override fun getItemCount(): Int = 10

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {

        when(getItemViewType(position)){
            0 -> {
                val normalHolder = holder as NormalViewHolder
                normalHolder.tv.text = "Post"
                normalHolder.itemView.setOnClickListener {
                    Log.d(TAG, "Clicked on Normal item")
                }
            }
            2 -> {
                val transparentHolder = holder as TransparentViewHolder
                transparentHolder.itemView.setOnClickListener {

                    listener.onClick()
                }
            }
        }
    }

    fun setListener(onItem:OnItemClick){
        listener = onItem
    }

    interface OnItemClick{

        fun onClick()
    }

    override fun getItemViewType(position: Int): Int = position % 2 * 2

    class NormalViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) {
        val tv:TextView = itemView.findViewById(R.id.tv_post)
    }

    class TransparentViewHolder(itemView: View): RecyclerView.ViewHolder(itemView)
}
const val TAG=“RvAdpater”
类RvAdpater:RecyclerView.Adapter(){
私有lateinit变量侦听器:OnItemClick
override fun onCreateViewHolder(父级:ViewGroup,viewType:Int):RecyclerView.ViewHolder{
val viewNormal=LayoutInflater.from(parent.context)。充气(R.layout.item_normal,parent,false)
val viewTransparent=LayoutInflater.from(parent.context)。充气(R.layout.item_transparent,parent,false)
返回时间(viewType){
0->NormalViewHolder(viewNormal)
2->透明视图文件夹(透明视图)
else->NormalViewHolder(viewNormal)
}
}
重写getItemCount():Int=10
覆盖onBindViewHolder(holder:RecyclerView.ViewHolder,位置:Int){
何时(getItemViewType(位置)){
0 -> {
val normalHolder=作为NormalViewHolder的holder
normalHolder.tv.text=“Post”
normalHolder.itemView.setOnClickListener{
Log.d(标记“单击正常项目”)
}
}
2 -> {
val transparentHolder=保持架为TransparentViewHolder
transparentHolder.itemView.setOnClickListener{
listener.onClick()
}
}
}
}
趣味setListener(onItem:OnItemClick){
监听器
}
界面单击{
fun onClick()
}
覆盖getItemViewType(位置:Int):Int=位置%2*2
类NormalViewHolder(itemView:View):RecyclerView.ViewHolder(itemView){
val tv:TextView=itemView.findViewById(R.id.tv\u post)
}
类TransparentViewHolder(itemView:View):RecyclerView.ViewHolder(itemView)
}
签出一个工作示例



对于处理多个视图类型,您可以使用库。

对于我来说,您想要实现什么还不清楚。请提供一个草图。@ USE158请参阅我的编辑。我不认为视频播放器是一个“装饰”。只需将表示视频的项目插入RV数据集中,并将其作为不同的对象处理,可能会更容易ViewType@TimCastelijns谢谢你的评论。但是我怎样才能达到那种像视差一样的效果呢?正如你们所看到的,视频在“回收者视图”下面。谢谢你们的评论。但你的方式行不通。正如您在视频中所看到的,即使您为背景视频创建了另一个视图,它也将是recycler视图数据的一部分。我想实现的是让它成为背景,让回收商处理它自己的数据。事实上你还没有读清楚。视频视图只是在后台,它不是recyclerview的一部分。你能点击视频吗?因为我猜回收者视图会阻止它。更新了答案,诀窍是使:透明项目
android:clickable=“false”
刚刚尝试了您的解决方案,将android:clickable=“false”添加到我的透明项目中,但仍然无法单击背景视图。为了更好地测试,我添加了一个简单的按钮,但它不处理点击(不接收)
class MainActivity : AppCompatActivity(), RvAdpater.OnItemClick {

    private lateinit var adView: View
    private lateinit var rvPosts: RecyclerView

    override fun onClick() {
        bringAdFront()
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        rvPosts = findViewById(R.id.rv_posts)
        rvPosts.layoutManager = LinearLayoutManager(this)

        val rvAdpater = RvAdpater()
        rvAdpater.setListener(this)
        rvPosts.adapter = rvAdpater
    }

    private fun bringAdFront() {

        adView = findViewById<View>(R.id.ad)
        adView.bringToFront()
    }

    override fun onBackPressed() {
        // to go back to the normal recycler view when back button is pressed
        val parent = rvPosts.parent as ViewGroup
        parent.removeAllViews()
        parent.addView(adView, 0)
        parent.addView(rvPosts, 1)
    }
}
const val TAG = "RvAdpater"

class RvAdpater : RecyclerView.Adapter<RecyclerView.ViewHolder>() {

    private lateinit var listener:OnItemClick


    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        val viewNormal = LayoutInflater.from(parent.context).inflate(R.layout.item_normal, parent, false)
        val viewTransparent = LayoutInflater.from(parent.context).inflate(R.layout.item_transparent, parent, false)

        return when(viewType){
            0 -> NormalViewHolder(viewNormal)
            2 -> TransparentViewHolder(viewTransparent)
            else -> NormalViewHolder(viewNormal)
        }

    }

    override fun getItemCount(): Int = 10

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {

        when(getItemViewType(position)){
            0 -> {
                val normalHolder = holder as NormalViewHolder
                normalHolder.tv.text = "Post"
                normalHolder.itemView.setOnClickListener {
                    Log.d(TAG, "Clicked on Normal item")
                }
            }
            2 -> {
                val transparentHolder = holder as TransparentViewHolder
                transparentHolder.itemView.setOnClickListener {

                    listener.onClick()
                }
            }
        }
    }

    fun setListener(onItem:OnItemClick){
        listener = onItem
    }

    interface OnItemClick{

        fun onClick()
    }

    override fun getItemViewType(position: Int): Int = position % 2 * 2

    class NormalViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) {
        val tv:TextView = itemView.findViewById(R.id.tv_post)
    }

    class TransparentViewHolder(itemView: View): RecyclerView.ViewHolder(itemView)
}