Android在每10个项目的recyclerview下方添加背景视图(如tumblr)
我正在尝试创建一个类似tumblr应用程序的回收器视图。你可以在这里看到: 我的问题是如何在recyclerview下面添加视频(或任何可点击的视频)?我添加了一个项目装饰实现,如下所示: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
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)
}