我正在尝试在我的应用程序的三个主要屏幕(提要,论坛和个人资料)之间实施简单的滑动操作。我一直在寻找在线指南,但他们似乎都采用相同的方法,并展示如何使用基本类的简单实例的片段来实现适配器,例如只是在屏幕上膨胀标题和数字。
在我的例子中,片段不是同一个类的所有实例,而是完全不同。
M问题存在于FragmentPagerAdapter中。我不知道如何返回getItem方法中的每个片段。
我尝试了以下但它不是作为一个有效的返回语句,但仍然期待一个:
class PagesPagerAdapter(fragmentManager: FragmentManager) : FragmentPagerAdapter(fragmentManager) {
override fun getItem(p0: Int): Fragment? {
return when (p0){
0 -> FeedFragment.newInstance()
1 -> BoardFragment.newInstance()
2 -> ProfileFragment.newInstance()
else -> FeedFragment.newInstance()
}
}
override fun getCount(): Int {
return 3
}
}
这是我的一个片段的示例:
class FeedFragment : Fragment() {
val galleryAdapter = GroupAdapter<ViewHolder>()
private fun setUpGalleryAdapter() {
feed_gallary.adapter = galleryAdapter
val galleryLayoutManager = GridLayoutManager(this.context, 3)
feed_gallary.layoutManager = galleryLayoutManager
val dummyUri =
"https://firebasestorage.googleapis.com/v0/b/dere-3d530.appspot.com/o/20150923_100950.jpg?alt=media&token=97f4b02c-75d9-4d5d-bc86-a3ffaa3a0011"
val imageUri = Uri.parse(dummyUri)
if (imageUri != null) {
galleryAdapter.add(FeedImage(imageUri))
galleryAdapter.add(FeedImage(imageUri))
galleryAdapter.add(FeedImage(imageUri))
galleryAdapter.add(FeedImage(imageUri))
galleryAdapter.add(FeedImage(imageUri))
}
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
setUpGalleryAdapter()
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? =
inflater.inflate(R.layout.fragment_feed, container, false)
companion object {
fun newInstance(): FeedFragment = FeedFragment()
}
}
这是我的主要活动:
class MainActivity : AppCompatActivity() {
private lateinit var viewPager: ViewPager
private lateinit var pagerAdapter: PagesPagerAdapter
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
viewPager = findViewById<ViewPager>(R.id.view_pager)
pagerAdapter = PagesPagerAdapter(supportFragmentManager)
viewPager.adapter = pagerAdapter
}
}
我还尝试定义一个变量currentFragment,为每个when语句重新分配它并使它成为返回值,但是因为我的所有片段都是唯一的,所以当尝试将它们全部分配给一个变量时,我会遇到类型不匹配。
是否有一些数组我可以存储片段然后返回数组位置?
我觉得这里可能有一个简单优雅和通用的解决方案。
在没有看到所有代码的情况下,我无法确定,但有一点需要注意的是,您必须返回片段的实例而不是对类的引用。例如:FeedFragment()
而不是FeedFragment
。
此外,您的when
语句没有默认情况导致getItem
方法的编译错误,因为您有一个不返回任何内容的代码路径。请尝试以下getItem
代码
override fun getItem(p0: Int): Fragment {
when(p0){
0 -> return FeedFragment.newInstance()
1 -> return BoardFragment.newInstance()
else -> return ProfileFragment.newInstance()
}
}
不幸的是,这种情况没有优雅的解决方案。您可以将创建的片段存储在数组中,然后在需要访问相关片段实例时使用此数组。
class PagesPagerAdapter(fragmentManager: FragmentManager) : FragmentPagerAdapter(fragmentManager) {
private val fragments = SparseArray<WeakReference<Fragment>>()
override fun getCount() = 3
override fun getItem(position: Int): Fragment? {
val fragmentReference = fragments[position]
return if (fragmentReference?.get() != null) {
fragmentReference.get()
} else {
return when (position) {
0 -> FeedFragment.newInstance()
1 -> BoardFragment.newInstance()
2 -> ProfileFragment.newInstance()
else -> error("Incorrect position: $position")
}
}
}
override fun instantiateItem(container: ViewGroup, position: Int): Any {
val fragment = super.instantiateItem(container, position) as Fragment
fragments.put(position, WeakReference(fragment))
return fragment
}