当前位置: 首页 > 知识库问答 >
问题:

如何将片段页面适配器用于唯一的不相关片段?

严峰
2023-03-14

我正在尝试在我的应用程序的三个主屏幕(提要、论坛)之间实现一个简单的滑动操作

在我的情况下,片段并不是同一类的所有实例,而是完全不同的。

M 问题存在于片段页面适配器中。我不确定如何返回 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

    }
}

我还尝试定义一个变量电流片段,为每个当语句重新分配它,并将其作为返回值,但由于我所有的片段都是唯一的,因此当尝试将它们全部分配给一个变量时,我得到了类型不匹配。

是否有一些数组我可以存储碎片,然后返回数组位置?

我觉得这里可能有一个简单、优雅、通用的解决方案。

共有2个答案

秦凯定
2023-03-14

不幸的是,这种情况没有优雅的解决方案。您可以将创建的片段存储在数组中,然后在需要访问相关片段实例时使用该数组。

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
    }
景高杰
2023-03-14

在没有看到您的所有代码的情况下,我无法确定,但需要注意的一点是,您必须返回片段的实例,而不是对类的引用。例如:FeedFraank()而不是FeedFraank

此外,您的< code>when语句没有导致< code>getItem方法编译错误的默认情况,因为您有一个不返回任何内容的代码路径。为< code>getItem尝试以下代码

override fun getItem(p0: Int): Fragment {

    when(p0){
        0 -> return FeedFragment.newInstance()
        1 -> return BoardFragment.newInstance()
        else -> return ProfileFragment.newInstance()
    }
}
 类似资料:
  • 我的viewpager适配器在另一个片段中(即主片段中),即我在另一片段中使用了viewpager。所以viewpager适配器有2个片段。 我从主片段连续获取心率值,需要将其发送到视图页管理器适配器,然后查看页管理器适配器将此值发送到此处对文本视图进行分段和更新。 主片段是 i 初始化片段页面进一步用更新的心率值:- 使用接口更新值:- //适配器代码:- } //片段代码被textview定期

  • 问题内容: 这个想法是我有一个列表视图,其中每个项目都是一个产品,当我单击该项目时,我需要从列表视图的适配器内部的单击中转到另一个片段。 我的适配器是: 您必须假设所有代码都在工作。 如何转到适配器内的产品Fragment? 问题答案: 为了解决这个问题,我要做的是: 在主类中,我将参数作为值,并通过开关在我感兴趣的main中设置了片段。

  • 错误:(117,63)错误:不兼容的类型:TabThree碎片无法转换为上下文 错误显示在"new GridViewAdapter(这个,图像,名称);" 公共类TabThreeFragment扩展了片段{ //返回inflater.inflate(R.layout.tab_three_fragment,容器,false);} //RequestQueue RequestQueue=截击。newR

  • 问题内容: 我有一些碎片。每个片段具有在(=挥动之前不可见的)用。 适配器设置为,这会减慢刷卡速度,因为每次创建时都要载入30个列表项,因为正在创建新的片段。 我的问题是,在空闲时刷卡后是否可以设置适配器?或者,还有更好的方法?扩展SlideDrawer时,该列表需要已经加载。 问题答案: 我的问题是,是否可以在Pager闲置时刷卡后设置适配器? 还有就是,你可以在设置监控的滑动手势。然后,您可以

  • 因此,下面的代码适用于一个活动,但当我使用onCreateView将其添加到一个片段中时,应用程序就会崩溃 Fragment公共类步骤扩展Fragment{ 12-13 15:17:15.062 984-984/com.stephenh.daytrack.daytrack.daytrackstephenh E/AndroidRuntime:致命异常:主进程:com.stephenh.daytrac