RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1354983
Accepted
Ethernets
Ethernets
Asked:2022-04-29 00:36:16 +0000 UTC2022-04-29 00:36:16 +0000 UTC 2022-04-29 00:36:16 +0000 UTC

使用 Kotlin 片段时不必要的数据重复

  • 772

帮助我理解为什么按下手机的“返回”按钮时数据重复,即我们有一个12个字段的列表,当从主片段移动到子片段再返回时,列表已经有24个字段,我们重复相同的步骤和列表已经是36个字段,等等现在也许记忆不会结束。

英雄碎片

 class HeroesFragment : Fragment() {

    private var mBinding: FragmentHeroesBinding? = null

    private lateinit var mAllInfoApex: HeroesViewModel

    private lateinit var mHeroesAdapter: HeroesAdapter

 override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setHasOptionsMenu(true)

    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
            mBinding = FragmentHeroesBinding.inflate(inflater, container, false)
            return mBinding!!.root
    }
     override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        mAllInfoApex =
            ViewModelProvider(this).get(HeroesViewModel::class.java)

        mAllInfoApex.getAllInfoApexFromAPI(Constants.API_PLAYER_VALUE)

        mBinding?.rvHeroList?.layoutManager = GridLayoutManager(requireActivity(), 2)

        mHeroesAdapter = HeroesAdapter(this@HeroesFragment)

        mBinding?.rvHeroList?.adapter = mHeroesAdapter

        InfoApexViewModelObserver()
    }
        fun heroesDetails(legends: Heroes){
        findNavController().navigate(HeroesFragmentDirections.actionAllHeroesToHeroesDetails(legends))
    }

    override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
        inflater.inflate(R.menu.menu_profile, menu)
        super.onCreateOptionsMenu(menu, inflater)
    }
        override fun onDestroy() {
        super.onDestroy()
        mBinding = null
    }
}

详情英雄片段

class DetailsHeroesFragment : Fragment() {

    private var mBinding: FragmentDetailsHeroesBinding? = null

    //private val hero : ArrayList<AllHeroes.Data>? = null


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        mBinding = FragmentDetailsHeroesBinding.inflate(inflater, container, false)
        // Inflate the layout for this fragment
        return mBinding!!.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        val args: DetailsHeroesFragmentArgs by navArgs()

        Glide.with(this)
            .load(args.heroesDetails.data.ImgAssets.banner)
            .into(mBinding!!.ivHeroesDetails)

        mBinding!!.tvHeroesName.text = args.heroesDetails.name

        args.heroesDetails.data.let { values ->
            when {
                values.data.isNullOrEmpty() -> {
                    mBinding!!.tvDataName.text = "NOT DATA"

                    mBinding!!.tvDataValue.visibility = View.INVISIBLE
                    mBinding!!.tvDataName2.visibility = View.INVISIBLE
                    mBinding!!.tvDataValue2.visibility = View.INVISIBLE
                    mBinding!!.tvDataName3.visibility = View.INVISIBLE
                    mBinding!!.tvDataValue3.visibility = View.INVISIBLE
                    mBinding!!.tvDataName4.visibility = View.INVISIBLE
                    mBinding!!.tvDataValue4.visibility = View.INVISIBLE

                    Log.i("Heroes test", "test")
                }
  else -> {
                    mBinding!!.tvDataName.visibility = View.INVISIBLE

                    mBinding!!.tvDataValue.visibility = View.INVISIBLE
                    mBinding!!.tvDataName2.visibility = View.INVISIBLE
                    mBinding!!.tvDataValue2.visibility = View.INVISIBLE
                    mBinding!!.tvDataName3.visibility = View.INVISIBLE
                    mBinding!!.tvDataValue3.visibility = View.INVISIBLE
                    mBinding!!.tvDataName4.visibility = View.INVISIBLE
                    mBinding!!.tvDataValue4.visibility = View.INVISIBLE
                }
            }
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        mBinding = null
    }
}

主要活动

class MainActivity : AppCompatActivity() {

    private lateinit var mBinding: ActivityMainBinding
    private lateinit var mNavController: NavController


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        mBinding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(mBinding.root)

        mNavController = findNavController(R.id.nav_host_fragment_activity_main)
        // Passing each menu ID as a set of Ids because each
        // menu should be considered as top level destinations.
        val appBarConfiguration = AppBarConfiguration(
            setOf(
                R.id.navigation_all_heroes,
                R.id.navigation_match_history,
                R.id.navigation_funny_videos
            )
        )
        setupActionBarWithNavController(mNavController, appBarConfiguration)
        mBinding.navView.setupWithNavController(mNavController)

    }
    override fun onSupportNavigateUp(): Boolean {
        return NavigationUI.navigateUp(mNavController, null)
    }    
}

也就是说,当我从DetailsHeroesFragment返回到HeroesFragment时,会在现有数据中添加一列完全相同的数据,如何解决这个问题?或者我在哪里错过了什么?在日志中,我看到数据是如何创建 2 次的,然后在转换期间又是 +2 次,等等。 在此处输入图像描述

视图模型

class HeroesViewModel: ViewModel() {

    private val allInfoApexAPIService = AllInfoApexAPIService()

    private val compositeDisposable = CompositeDisposable()

    val loadAllInfoApex = MutableLiveData<Boolean>()
    val allInfoApexResponse = MutableLiveData<AllHeroes.Heroes>()
    val allInfoApexLoadingError = MutableLiveData<Boolean>()

    fun getAllInfoApexFromAPI(username: String){
        loadAllInfoApex.value = true

        compositeDisposable.add(
            allInfoApexAPIService.getAllInfoApexTracker(player = username)
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeWith(object: DisposableSingleObserver<AllHeroes.Heroes>(){
                    override fun onSuccess(value: AllHeroes.Heroes) {
                        loadAllInfoApex.value = false
                        allInfoApexResponse.value = value
                        allInfoApexLoadingError.value = false

                    }

                    override fun onError(e: Throwable) {
                        loadAllInfoApex.value = false
                        allInfoApexLoadingError.value = true
                        e.printStackTrace()
                    }

                })
        )
    }
}
android
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    IR42
    2022-04-29T02:06:54Z2022-04-29T02:06:54Z

    当你转到第二个fragment时,第一个fragment中的View被销毁,当你返回第一个fragment时,又重新创建了View,它们分别称为onCreateView、 onViewCreated和mAllInfoApex.getAllInfoApexFromAPI。大概就是这种情况。一种解决方案是将调用移动getAllInfoApexFromAPI到init块ViewModel

    • 1

相关问题

  • 来自片段的列表落后于 BottomNavigationView

  • 无法将变量从 Activity 传递到 Fragment

  • 构建与完成的片段略有不同的片段的最佳方法是什么?

  • 如何更改来自服务器的响应中的日期格式?

  • 谷歌地图在应用程序的发布版本中不起作用

  • 材料设计按钮。单击按钮上的可选区域!

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    表格填充不起作用

    • 2 个回答
  • Marko Smith

    提示 50/50,有两个,其中一个是正确的

    • 1 个回答
  • Marko Smith

    在 PyQt5 中停止进程

    • 1 个回答
  • Marko Smith

    我的脚本不工作

    • 1 个回答
  • Marko Smith

    在文本文件中写入和读取列表

    • 2 个回答
  • Marko Smith

    如何像屏幕截图中那样并排排列这些块?

    • 1 个回答
  • Marko Smith

    确定文本文件中每一行的字符数

    • 2 个回答
  • Marko Smith

    将接口对象传递给 JAVA 构造函数

    • 1 个回答
  • Marko Smith

    正确更新数据库中的数据

    • 1 个回答
  • Marko Smith

    Python解析不是css

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5