【问题标题】:Pass parcelable arraylist from MainActivity to Fragment将 Parcelable arraylist 从 MainActivity 传递给 Fragment
【发布时间】:2021-02-10 19:17:02
【问题描述】:

我想将 MainActivity 中的对象数组列表传递给我的 OverviewFragment。类如下。

@Parcelize
data class User(
    val id: String? = null,
    val firstName: String? = null,
    val lastName: String? = null,
    val email: String? = null,
    val WSC_Member: Boolean? = false,
    val Landesliga: Boolean? = false,
    val Superuser: Boolean? = false
) : Parcelable {

    fun getName(): String? {
        return "$firstName $lastName"
    }

}

在 MainActivity 的 onCreateView 中,我通过函数 getUsersData 获取所有用户并将其传递给 bundle

val overviewFragment: Fragment = OverviewFragment()
val fragmentManager: FragmentManager = supportFragmentManager
val data = Bundle()

// Get all users
GlobalScope.launch(Dispatchers.IO) {

    val allPlayers = getUsersData(userDocs)
    data.putParcelableArrayList("allPlayers", allPlayers)
    overviewFragment.arguments = data

    fragmentManager.beginTransaction().replace(
        R.id.overviewLayout,
        overviewFragment,
        "overviewFragment"
    ).addToBackStack(null).commit()

}

getUsersData函数:

suspend fun getUsersData(UserCollection: CollectionReference): ArrayList<User> {

    val snapshot = UserCollection.get().await()
    val allPlayers = arrayListOf<User>()

    snapshot.documents.forEach { playerI ->

        val userI = User(
            playerI.id,
            playerI.getString("firstName"),
            playerI.getString("lastName"),
            playerI.getString("email"),
            playerI.getBoolean("WSC_Member"),
            playerI.getBoolean("Landesliga"),
            playerI.getBoolean("Superuser")
        )

        allPlayers.add(userI)

    }

    return allPlayers

}

在OverviewFragmentsonCreateView

    val data = arguments
    val allPlayers = data?.getParcelableArrayList<User>("allPlayers")
    val test1 = allPlayers?.count()
    Log.i(TAG, "Test1: $test1")

我尝试获取数据,但它仍然是null。我错过了什么?

I/OverviewFragment: Test1: null

【问题讨论】:

    标签: android firebase android-studio kotlin


    【解决方案1】:

    这不是你想要的。您不应该在屏幕之间手动传递这些数据,而是应该将其存储在存储库中,应用程序中的每个屏幕都可以访问该存储库,并且他们可以自己提取数据。如果您希望它为特定项目提取数据,则可以将 Id 作为参数传递给 Fragment。

    另外,您错误地使用了协程,它们不应该在 Activity 中使用,也绝对不能在 GlobalScope 中使用。您应该使用 ViewModel,它具有 viewModelScope,其生命周期与屏幕的生命周期相关联。 ViewModel 也可以在方向变化中幸存下来。您将从 ViewModel 访问您的存储库,然后 Fragment 将使用 LiveData 观察数据。

    您可以查看展示这些模式的 Google 的 Sunflower 示例项目。

    欲了解更多信息,请查看以下链接:

    【讨论】:

    • 即使这没有解释如何做你想做的事,你应该这样做,这是正确的方法。
    • 非常感谢您提供的信息!我是 android 开发新手,你的回答比我真正想要的更有帮助。
    猜你喜欢
    • 1970-01-01
    • 2019-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多