我有一个简单的ViewPager支持一个PagerAdapter,但对于我实例化的视图从不显示在视图分页器中。视图不显示在ViewPager
我有要求纯粹在代码中开发用户界面。所以我不能在instantiateItem方法中膨胀一个xml布局。不幸的是,几乎所有我看到的例子都是xml膨胀,这显然不起作用。
所以我有一个PagerAdapter,(我不想使用片段)与ViewPager如下。该适配器需要一些数据
val viewAdapter = ViewPagerAdapter(data)
viewPager.adapter = viewAdapter
ViewPagerAdapter看起来是这样的:
inner class ViewPagerAdapter(val data: List<Item>) : PagerAdapter() {
override fun isViewFromObject(view: View?, obj: Any?): Boolean {
return obj == view
}
override fun getCount(): Int {
return data.count()
}
override fun instantiateItem(container: ViewGroup?, position: Int): Any {
val rootLayout = LinearLayout(container?.context)
rootLayout.layoutParams = rootLayout.setDimensions(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT)
rootLayout.orientation = LinearLayout.HORIZONTAL
val title = Button(container?.context)
title.text = "Title"
title.textSize = 13f
title.setTextColor(Color.WHITE)
rootLayout.addView(title)
val subtitle = Button(container?.context)
subtitle.text = "Subtitle"
subtitle.textSize = 13f
subtitle.setTextColor(Color.WHITE)
rootLayout.addView(subtitle)
(container as ViewPager).addView(rootLayout)
return rootLayout
}
override fun getPageTitle(position: Int): CharSequence {
return data[position].title
}
override fun destroyItem(container: ViewGroup?, position: Int, obj: Any?) {
if (obj == null) return
container?.removeView(obj as View?)
}
}
}
对我的生活中,我看不出有什么不对的代码。我试过改变布局,textview到一个按钮,但没有任何作品。
我希望有人能指出我正确的方向吗?
谢谢!
更新:
我创建了一个简单的应用程序,以证明我没有做任何愚蠢的。应该能够复制和粘贴这个并运行它,只要你已经添加了相关的库。
import android.graphics.Color
import android.os.Bundle
import android.support.design.widget.AppBarLayout
import android.support.design.widget.CoordinatorLayout
import android.support.design.widget.TabLayout
import android.support.v4.view.PagerAdapter
import android.support.v4.view.ViewPager
import android.support.v7.app.AppCompatActivity
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.LinearLayout
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val rootLayout = CoordinatorLayout(this)
rootLayout.layoutParams = CoordinatorLayout.LayoutParams(CoordinatorLayout.LayoutParams.MATCH_PARENT, CoordinatorLayout.LayoutParams.MATCH_PARENT)
val appBarLayout = AppBarLayout(this)
rootLayout.addView(appBarLayout)
appBarLayout.layoutParams = CoordinatorLayout.LayoutParams(CoordinatorLayout.LayoutParams.MATCH_PARENT, CoordinatorLayout.LayoutParams.WRAP_CONTENT)
val tabLayout = TabLayout(this)
tabLayout.tabMode = TabLayout.MODE_FIXED
tabLayout.tabGravity = TabLayout.GRAVITY_FILL
appBarLayout.addView(tabLayout)
tabLayout.layoutParams = AppBarLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT)
//add viewpager
val viewPager = ViewPager(this)
viewPager.id = 11122
val viewAdapter = ViewPagerAdapter()
viewPager.adapter = viewAdapter
rootLayout.addView(viewPager)
viewPager.layoutParams = CoordinatorLayout.LayoutParams(CoordinatorLayout.LayoutParams.MATCH_PARENT, CoordinatorLayout.LayoutParams.MATCH_PARENT)
tabLayout.setupWithViewPager(viewPager)
rootLayout.setBackgroundColor(Color.BLACK)
setContentView(rootLayout)
}
inner class ViewPagerAdapter : PagerAdapter() {
override fun isViewFromObject(view: View?, obj: Any?): Boolean {
return obj == view
}
override fun getCount(): Int {
return 3
}
override fun instantiateItem(container: ViewGroup?, position: Int): Any {
val rootLayout = LinearLayout(container?.context)
rootLayout.layoutParams = LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT)
rootLayout.orientation = LinearLayout.HORIZONTAL
val title = Button(container?.context)
title.text = "Title"
title.textSize = 13f
title.setTextColor(Color.WHITE)
rootLayout.addView(title)
val subtitle = Button(container?.context)
subtitle.text = "Subtitle"
subtitle.textSize = 13f
subtitle.setTextColor(Color.WHITE)
rootLayout.addView(subtitle)
val viewPager = container as ViewPager
viewPager.addView(rootLayout, 0)
return rootLayout
}
override fun getPageTitle(position: Int): CharSequence {
return "Title: $position"
}
override fun destroyItem(container: ViewGroup?, position: Int, obj: Any?) {
if (obj == null) return
when (obj) {
is ArrayList<*> -> for (item in obj) {
container?.removeView(item as View?)
}
else -> container?.removeView(obj as View?)
}
}
}
}
我不知道的优势,但我猜你用错误的'addView'方法。试试从ViewPager - > https://developer.android.com/reference/android/support/v4/view/ViewPager.html#addView%28android.view.View%2C%20int%2C%20android.view.ViewGroup .LayoutParams%29 –
@RalphBergmann刚刚尝试过:val viewPager = container as ViewPager viewPager.addView(rootLayout,0,ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT)) - 没有什么区别。 – WolfBane
你可以省略你设置布局参数的那一行,而不是使用'container.addView(rootLayout,0)'而不是 –