视图不会显示在ViewPager中

我有一个简单的ViewPager支持一个PagerAdapter,但对于我实例化的视图永远不会显示在视图分页器。

我有一个要求纯粹在代码中开发用户界面。 所以我不能在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?) } } } 

}

看看你的完整活动代码。 看起来你在视图页面上设置了一个CoordinatorLayout布局参数,但是你忘了设置行为,因为你在层次结构中也有一个AppBarLayout 。 因此,视图寻呼机内容正在绘制标签布局的后面。 您可以使用AS中的布局检查器进行验证。

执行以下操作应该可以解决您的问题

 val pagerParams = CoordinatorLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT) pagerParams.behavior = AppBarLayout.ScrollingViewBehavior() viewPager.layoutParams = pagerParams 

你也可以利用Kotlin的apply功能

 viewPager.layoutParams = CoordinatorLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT).apply { behavior = AppBarLayout.ScrollingViewBehavior() } 

希望有所帮助