首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ListView的最新更新

问ListView的最新更新
EN

Stack Overflow用户
提问于 2018-02-25 00:38:37
回答 1查看 36关注 0票数 0

我让listView使用Realm来填充这些项。列表视图是宝永章的SwipeMenuListView。我有一个问题,listView没有立即更新。相反,当我存在应用程序并返回时,列表将反映新的更改。

我使用AlertDialog提示用户更新选定的参数,这些参数将在listView中更新。

我使用RealmHelper类填充listView ArrayAdapter

下面是帮助器类(RealmHelper)的代码:

代码语言:javascript
复制
fun readAll(): ArrayList<User> {
   val finalList = ArrayList<User>()
   val listOfUsers = mRealm.where(User::class.java).findAll()

   finalList += listOfUsers

   return finalList
}

这是主要的活动类代码

代码语言:javascript
复制
class Users: AppCompatActivity() {

    private lateinit var realm: Realm

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.list_of_emirates)

        realm = Realm.getDefaultInstance()
        val helper = RealmHelper(realm)
        val users = helper.readAll()
        val mAdapter = MyAdapter(this, users)
        listView.adapter = mAdapter
   }
}

这是实际发生更新的主要代码:

代码语言:javascript
复制
listView.setOnMenuItemClickListener(SwipeMenuListView.OnMenuItemClickListener { position, menu, index ->

            when (index) {
                0 -> {
                    val alert = AlertDialog.Builder(this@Users).create()
                    alert.setTitle("Update Car Details")
                    val all = realm.where(User::class.java).findAll()
                    val selectedCar = all[position]!!
                    val name = EditText(this@Users)
                    name.hint = "Nickname"
                    val carNumber = EditText(this@Users)
                    carNumber.hint = "Car Number"
                    val duration = EditText(this@Users)
                    duration.hint = "Duration (hr)"
                    val code = EditText(this@Emirates)
                    code.hint = "Code"

                    name.setText(selectedCar.nickName)
                    carNumber.setText(selectedCar.plateNum)
                    duration.setText(selectedCar.duration)
                    code.setText(selectedCar.code)

                    val layout = LinearLayout(this)
                    layout.orientation = LinearLayout.VERTICAL
                    layout.addView(name)
                    layout.addView(carNumber)
                    layout.addView(duration)
                    layout.addView(code)

                    alert.setView(layout, 60, 0,60,0)

                    alert.setButton(AlertDialog.BUTTON_POSITIVE,"Update", object :DialogInterface.OnClickListener {
                        override fun onClick(dialog: DialogInterface?, which: Int) {

                            realm.beginTransaction()
                            selectedCar.code = code.text.toString()
                            selectedCar.plateNum = carNumber.text.toString()
                            selectedCar.duration = duration.text.toString()
                            selectedCar.nickName = name.text.toString()
                            emirates[position] = selectedCar
                            realm.commitTransaction()
                            mAdapter.notifyDataSetChanged()
                            Toast.makeText(this@Users, "${mAdapter.notifyDataSetChanged()} called", Toast.LENGTH_LONG).show()

                        }
                    })

                    alert.setButton(AlertDialog.BUTTON_NEGATIVE, "Cancel", object : DialogInterface.OnClickListener {
                        override fun onClick(dialog: DialogInterface?, which: Int) {
                            dialog?.dismiss()
                        }

                    })

                    alert.show()
                }
                1 -> {
                    realm.beginTransaction()
                    val all = realm.where(User::class.java).findAll()
                    val selectedUser = all[position]
                    selectedUser?.deleteFromRealm()
                    emirates.removeAt(position)
                    realm.commitTransaction()
                    mAdapter.notifyDataSetChanged()
                }
                else -> return@OnMenuItemClickListener false
            }

            true
        })

我使用Toast来测试是否调用了mAdapter.notifyDataSetChanged(),并验证了是否调用了它,但似乎listView直到应用程序重新启动后才会更新。

你知道为什么会发生这种行为吗?

注意:这是指向:https://github.com/baoyongzhang/SwipeMenuListView的实际库的链接

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-25 01:11:12

notifyDataSetChanged方法的问题在于,它会检测到信息源何时发生更改,但不会检测到何时重新签名。我在使用这种方法时遇到了很多问题,所以我建议在这种情况下不使用notifyDateSetChanged,但您可以使用新的信息源创建一个新的适配器。尝试使用此更改。

代码语言:javascript
复制
alert.setButton(AlertDialog.BUTTON_POSITIVE,"Update", object :DialogInterface.OnClickListener {
                        override fun onClick(dialog: DialogInterface?, which: Int) {

                            realm.beginTransaction()
                            selectedCar.code = code.text.toString()
                            selectedCar.plateNum = carNumber.text.toString()
                            selectedCar.duration = duration.text.toString()
                            selectedCar.nickName = name.text.toString()
                            emirates[position] = selectedCar
                            realm.commitTransaction()
                            val realm = Realm.getDefaultInstance()
                            val helper = RealmHelper(realm)
                            val users = helper.readAll()
                            mAdapter = MyAdapter(this, users)
                            listView.adapter = mAdapter
                            Toast.makeText(this@Users, "${mAdapter.notifyDataSetChanged()} called", Toast.LENGTH_LONG).show()

                        }
                    })

试试这个,我希望它能和你一起工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48965103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档