android - Kotlin Android - 当主 Activity 添加项目时从 fragment 刷新 ListView

标签 android listview android-fragments kotlin

我有一个带有 2 个子菜单的 BottomNavigationView,Home 和 Email,以及一个可以将项目添加到 Email 的 fab。

我正在使用 fragment EmailFragment 来处理子菜单点击。现在,在 EmailFragment 中我有一个 ListView。 BottomNavigationMenu 中的 fab 能够从 MainActivity 添加项目到 EmailFragment ListView 并且工作正常。问题是,只有当我重新打开 EmailFragment 及其布局时,我才会看到新的 ListView 项目。

我希望当我向此 ListView 添加项目时无需重新打开 fragment 。

这是我在 MainActivity 中添加项目的方式:

 positiveButton.setOnClickListener{

                if(dialogView.email_textInput.text!!.isEmpty() || dialogView.email_password_textInput.text!!.isEmpty()) {
                    Toast.makeText(this, resources.getString(R.string.empty_fields), Toast.LENGTH_LONG).show()
                }

                else{

                    emailAddresses.add(dialogView.email_textInput.text!!.toString())


                    adapter.notifyDataSetChanged()

                    saveData()

                }
            }

这是我从 MainActivity 保存数据的方式:

private fun saveData() {
    val sharedPreferences = getSharedPreferences("shared preferences", MODE_PRIVATE)
    val editor = sharedPreferences.edit()
    val gson = Gson()
    val json = gson.toJson(emailAddresses) //convert ArrayList to JSON (shared preferences can't handle ArrayList)
    editor.putString("emailAddresses", json) //save the new JSON with values
    editor.apply() //apply new changes
}

这是我从 EmailFragment 获取数据的方式:

private fun loadData() {
    val sharedPreferences = this.activity!!.getSharedPreferences("shared preferences", MODE_PRIVATE)
    val gson = Gson()
    val json = sharedPreferences.getString("emailAddresses", null)
    val type = object : TypeToken<ArrayList<String>>() {
    }.type

    when (json) {
        null -> emailAddresses = ArrayList() //if json is null, so empty, values is just an empty ArrayList
        else -> emailAddresses = gson.fromJson(json, type) //got JSON values and convert them back to ArrayList

    }
}

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?

): View? {

    loadData()

    val adapter = ArrayAdapter(this.activity!!.applicationContext, R.layout.listview_text, emailAddresses)
    adapter.notifyDataSetChanged()

    val mainView = inflater.inflate(R.layout.fragment_email, container, false)

    mainView.email_listView.adapter = adapter

    return mainView
}

最佳答案

使用LiveData,LiveData会观察变化并自动刷新adapter

关于android - Kotlin Android - 当主 Activity 添加项目时从 fragment 刷新 ListView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57374439/

相关文章:

listview - 在 Xamarin.Forms Windows Phone 中查看单元格错误

java - 尝试从 Activity 接收对象时 fragment 崩溃

java - android 简单的自定义动画

android - 如何显示 Activity 指示器而不是图库图像?

切换 fragment 后,Android TabLayout 不再显示内容

android - 在 Android 应用程序中将软键背景从黑色更改为透明

Android Navigation Architecture 组件,处理不同的backstacks

android - 如果有 getArguments(),我们是否应该在 fragment 中使用 savedInstanceState?

android - 由于兼容性问题,Note 9 用户无法下载我们的应用程序

java - 如何给出准确的 Firebase 引用?