2017-06-05 68 views
0

我有一个简单的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?) 
     } 
    } 
} 

}

+0

我不知道的优势,但我猜你用错误的'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 –

+0

@RalphBergmann刚刚尝试过:val viewPager = container as ViewPager viewPager.addView(rootLayout,0,ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT)) - 没有什么区别。 – WolfBane

+0

你可以省略你设置布局参数的那一行,而不是使用'container.addView(rootLayout,0)'而不是 –

回答

1

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

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

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

你也可以采取科特林的apply功能

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

希望帮助

+0

你是明星!这解决了这个问题。一旦我改变了代码设置视图寻呼机布局参数,并调整了一下定位,它就像一个魅力。 – WolfBane

+0

很高兴帮助:) –