2017-06-05 69 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

很高興幫助:) –