「はじめてのAndroidプログラミング」でフラグメントの勉強中です。現在、第8章の「フラグメントを使ったスライドショーアプリ」に取り組み中。
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) pager.adapter = MyAdapter(supportFragmentManager) val handler = Handler() timer(period = 5000){ handler.post{ pager.currentItem = (pager.currentItem + 1) % 10 } } } class MyAdapter(fm: FragmentManager) : FragmentPagerAdapter(fm){ private val resources = listOf( R.mipmap.homberg, R.mipmap.ocean, R.mipmap.tree,R.mipmap.tree2,R.mipmap.tree3 ) override fun getItem(position: Int): Fragment { return ImageFragment.newInstance(resources[position]) } override fun getCount(): Int { return resources.size } } }
指示されたコードはこんな感じです。しかし少し気になるところがあります。
pager.currentItem = (pager.currentItem + 1) % 10
の箇所ですね。「%10」って数量が固定されている。スライドショーの写真の枚数が入るべきところですが、固定になっている。これはプログラム的にはよろしくないですね。「resources」に写真を追加すると枚数変わりますし。
写真枚数のところは写真の配列の数を指定すべきなので、
pager.currentItem = (pager.currentItem + 1) % pager.adapter.count
としましたが、「Smart cast to 'MainActivity.MyAdapter' is impossible, because 'pager.adapter' is a complex expression.」というエラーが出てしまいます。はて?
赤ヒントが出てますね。
「Cast expression 'pager.adapter' to 'MainActivity.MyAdapter'」という修正候補が出ています。
これを実行すると、
pager.currentItem = (pager.currentItem + 1) % (pager.adapter as MyAdapter).count
こうなります。つまり明示的にキャストしてやればいいのか。。。
派生元クラスのFragmentPagerAdapterにcount用のメソッドであるgetCount()が実装されていると思ったのですが、そうではなかったようです。MyAdapterでしか実装していないので、FragmentPagerAdapterのままではアクセスできないのですね。フムフム。。。
次行ってみよう!!