我让listView使用Realm来填充这些项。列表视图是宝永章的SwipeMenuListView。我有一个问题,listView没有立即更新。相反,当我存在应用程序并返回时,列表将反映新的更改。
我使用AlertDialog提示用户更新选定的参数,这些参数将在listView中更新。
我使用RealmHelper类填充listView ArrayAdapter
下面是帮助器类(RealmHelper)的代码:
fun readAll(): ArrayList<User> {
val finalList = ArrayList<User>()
val listOfUsers = mRealm.where(User::class.java).findAll()
finalList += listOfUsers
return finalList
}这是主要的活动类代码
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
}
}这是实际发生更新的主要代码:
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的实际库的链接
发布于 2018-02-25 01:11:12
notifyDataSetChanged方法的问题在于,它会检测到信息源何时发生更改,但不会检测到何时重新签名。我在使用这种方法时遇到了很多问题,所以我建议在这种情况下不使用notifyDateSetChanged,但您可以使用新的信息源创建一个新的适配器。尝试使用此更改。
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()
}
})试试这个,我希望它能和你一起工作。
https://stackoverflow.com/questions/48965103
复制相似问题