如何解决使用来自 Firebase 的 LivaData 填充 Android Spinner
如何使用已保存在 Firebase RTDB 中的数据加载微调器?
我在想这样的事情可能会奏效
viewModel.liveCharacterModel.observe(this,Observer { spinnerData ->
val spinnerAdapter = ArrayAdapter(this,android.R.layout.simple_spinner_item,spinnerData)
select_character.adapter = spinnerAdapter
})
但我在 ArrayAdapter 上遇到错误 “不能使用提供的参数调用以下任何函数。”
如果相关,这是我的 characterViewModel 代码
class CharacterViewModel : ViewModel() {
private val dbCharacterModels = FirebaseDatabase.getInstance().getReference(NODE_CHARACTERS)
//add data from db to this list for use in the
// characterModelAdapter class for the recycler view
private val _characters = MutableLiveData<List<CharacterModel>>()
val characterModel: LiveData<List<CharacterModel>>
get() = _characters
//live data for new data added
private val _liveCharacters = MutableLiveData<CharacterModel>()
val liveCharacterModel: LiveData<CharacterModel>
get() = _liveCharacters
private val _result = MutableLiveData<Exception?>()
val result: LiveData<Exception?>
get() = _result
private val childEventListener = object : ChildEventListener {
override fun onChildAdded(snapshot: DataSnapshot,previousChildName: String?) {
val liveCharacterModel = snapshot.getValue(CharacterModel::class.java)
liveCharacterModel?.id = snapshot.key
_liveCharacters.value = liveCharacterModel
}
override fun onChildChanged(snapshot: DataSnapshot,previousChildName: String?) {
val liveCharacterModel = snapshot.getValue(CharacterModel::class.java)
liveCharacterModel?.id = snapshot.key
_liveCharacters.value = liveCharacterModel
}
override fun onChildRemoved(snapshot: DataSnapshot) {
val liveCharacterModel = snapshot.getValue(CharacterModel::class.java)
liveCharacterModel?.id = snapshot.key
liveCharacterModel?.charDeleted = true
_liveCharacters.value = liveCharacterModel
}
override fun onChildMoved(snapshot: DataSnapshot,previousChildName: String?) {
TODO("Not yet implemented")
}
override fun onCancelled(error: DatabaseError) {
TODO("Not yet implemented")
}
}
/*
Add character to DB,save a character under the characters node in the DB with a
unique key id.
*/
fun addCharacter(character: CharacterModel) {
character.id = dbCharacterModels.push().key
character.id?.let {
dbCharacterModels.child(it).setValue(character).addOnCompleteListener {
if (it.isSuccessful) {
_result.value = null
} else {
_result.value = it.exception
}
}
}
}
fun getDBUpdates() {
dbCharacterModels.addChildEventListener(childEventListener)
}
/*
Fetch data from the db,make sure the data is not null,add it to a list and assign
it to the mutable list which gets displayed in the fragment
*/
fun getCharacters() {
dbCharacterModels.addListenerForSingleValueEvent(object : ValueEventListener {
override fun onDataChange(snapshot: DataSnapshot) {
if (snapshot.exists()) {
val characters = mutableListOf<CharacterModel>()
for (characterSnapshot in snapshot.children) {
val character = characterSnapshot.getValue(CharacterModel::class.java)
character?.id = characterSnapshot.key
character?.let { characters.add(it) }
}
_characters.value = characters
}
}
override fun onCancelled(error: DatabaseError) {
TODO("Not yet implemented")
}
})
}
//overrite existing character with new values
fun editCharacter(character: CharacterModel) {
dbCharacterModels.child(character.id!!).setValue(character)
.addOnCompleteListener {
if (it.isSuccessful) {
_result.value = null
} else {
_result.value = it.exception
}
}
}
fun deleteCharacter(character: CharacterModel) {
dbCharacterModels.child(character.id!!).setValue(null)
.addOnCompleteListener {
if (it.isSuccessful) {
_result.value = null
} else {
_result.value = it.exception
}
}
}
//remove the event listener when fragment is destroyed
override fun onCleared() {
super.onCleared()
dbCharacterModels.removeEventListener(childEventListener)
}
}
这是我的 CharacterModelAdapter 代码,我用于在回收站视图中显示数据,以防其相关
class CharacterModelAdapter: RecyclerView.Adapter<CharacterModelAdapter.CharacterViewModel>() {
private var characters = mutableListOf<CharacterModel>()
var listener: CharacterRecyclerViewListener? = null
override fun onCreateViewHolder(parent: ViewGroup,viewType: Int) = CharacterViewModel (
LayoutInflater.from(parent.context)
.inflate(R.layout.recycler_view_character,parent,false))
override fun getItemCount() = characters.size
override fun onBindViewHolder(holder: CharacterModelAdapter.CharacterViewModel,position: Int) {
holder.view.text_view_name.text = characters[position].name
holder.view.text_view_race.text = characters[position].race
holder.view.text_view_class.text = characters[position].classType
holder.view.edit_character.setOnClickListener {
listener?.onRecyclerViewButtonClick(it,characters[position])
}
holder.view.delete_character.setOnClickListener {
listener?.onRecyclerViewButtonClick(it,characters[position])
}
}
fun setCharcaters(characters: List<CharacterModel>) {
this.characters = characters as MutableList<CharacterModel>
notifyDataSetChanged()
}
/*
function that checks if a character is already in the list before adding
checks if charDeleted is true or false for deleting and also checks which index the character
is at for editing. notifyDatasetChaged is then called so the recycler view updates and displays
the changes
*/
fun addCharacter(character: CharacterModel) {
if(!characters.contains(character)) {
characters.add(character)
notifyDataSetChanged()
} else {
val index = characters.indexOf(character)
if(character.charDeleted) {
characters.removeAt(index)
}else {
characters[index] = character
}
}
notifyDataSetChanged()
}
class CharacterViewModel(val view: View): RecyclerView.ViewHolder(view)
}
这是我想在里面实现微调器的弹出片段
class CreateRaidPopupFragment: DialogFragment(),AnkoLogger {
private lateinit var viewModel: CharacterViewModel
private val adapter = CharacterModelAdapter()
override fun onCreateView(
inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_create_raid_popup,container,false)
}
override fun onViewCreated(view: View,savedInstanceState: Bundle?) {
super.onViewCreated(view,savedInstanceState)
viewModel.liveCharacterModel.observe(this,spinnerData)
select_character.adapter = spinnerAdapter
})
}
}
解决方法
修复它,我需要改变我的功能
viewModel.characterModel.observe(this,Observer {
val spinnerAdapter =
ArrayAdapter(requireContext(),android.R.layout.simple_spinner_item,it)
select_character.adapter = spinnerAdapter
})
而且我还需要在此之前调用 getCharacters 函数
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。