【问题标题】:Textview dispalys "androidx.livecycle.CoroutineLiveData"Textview 显示“android.lifecycle.Coroutine LiveData”
【发布时间】:2021-06-25 13:55:32
【问题描述】:

我想在文本视图中显示我房间数据库中一列的总和。 实现我的查询并设置 Textview 的文本后,它显示以下内容:

androidx.lifecycle.CoroutineLiveData@76f6edd

知道为什么会这样吗?是因为我的查询不起作用还是我的实施方式错误? 这是我第一次真正编程。我知道我的大部分代码可能不是 100% 正确,但我正在努力。

我道之问:

@Query("SELECT SUM(total)AS sum_total FROM receipt_table")
    fun getSum(): Flow<Float>

片段:

@AndroidEntryPoint
class HistoryFragment : Fragment(R.layout.fragment_history) {

private val viewModel: PurchaseViewmodel by viewModels()


override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    return inflater.inflate(R.layout.fragment_history, container, false)
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    val binding = FragmentHistoryBinding.bind(view)

    val exampleAdapter = ExampleAdapter()

    binding.apply{
        recyclerView.apply{

            layoutManager = LinearLayoutManager(requireContext())
            adapter = exampleAdapter

        }
        totalSumTextView.apply {
            val totalSum = viewModel.totalSum
            text = totalSum.toString()
        }
        ItemTouchHelper(object : ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT) {
            override fun onMove(
                recyclerView: RecyclerView,
                viewHolder: RecyclerView.ViewHolder,
                target: RecyclerView.ViewHolder
            ): Boolean {
                return false 
            }

            override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
                val receipt = exampleAdapter.currentList[viewHolder.adapterPosition]
                 viewModel.onSwipe(receipt)
            }
        }).attachToRecyclerView(recyclerView)
    }

    setFragmentResultListener("add_receipt_request"){_,bundle ->
        val result = bundle.getInt("add_receipt_request")
        viewModel.onAddResult(result)
    }

    viewModel.receipts.observe(viewLifecycleOwner){ 
        exampleAdapter.submitList(it)
    }


    viewLifecycleOwner.lifecycleScope.launchWhenStarted {
        viewModel.addTaskEvent.collect {  event->
            when(event){
                is PurchaseViewmodel.TasksEvent.ShowUndoDelete -> {
                    Snackbar.make(requireView(),"Tasks deleted", Snackbar.LENGTH_LONG)
                        .setAction("UNDO"){
                            viewModel.unDoDeleteClick(event.receipts)
                        }.show()
                }
            }
        }
    }
}
}

还有视图模型:

@HiltViewModel
class PurchaseViewmodel @Inject constructor(
private val receiptDao: ReceiptDao
    ): ViewModel() {
private val tasksEventChannel = Channel<TasksEvent>()
val addTaskEvent = tasksEventChannel.receiveAsFlow()
val receipts = receiptDao.getAllReceipts().asLiveData()
val totalSum = receiptDao.getSum().asLiveData()

fun onAddResult(result: Int){
    when (result){
        ADD_RECEIPT_RESULT_OK ->showReceiptSavedConfirmation("Receipt has been saved")
    }
}
private fun showReceiptSavedConfirmation (text: String) = viewModelScope.launch {
    tasksEventChannel.send(TasksEvent.ShowReceiptSavedConfirmation(text))
}

fun onSwipe (receipts: Receipts) = viewModelScope.launch {
    receiptDao.delete(receipts)
    tasksEventChannel.send(TasksEvent.ShowUndoDelete(receipts))
}
fun unDoDeleteClick (receipts: Receipts) = viewModelScope.launch {
    receiptDao.insert(receipts)
}

sealed class TasksEvent {
    data class ShowReceiptSavedConfirmation(val msg: String) : TasksEvent()
    data class ShowUndoDelete(val receipts: Receipts) : TasksEvent()
}
}

【问题讨论】:

    标签: android kotlin android-room


    【解决方案1】:

    您在这里得到一个LiveData 对象,而不仅仅是一个值:

     val totalSum = receiptDao.getSum().asLiveData()
    

    当你打电话时:

    totalSum.toString()
    

    它在LiveData 对象上调用toString 方法,原因是你的TextView 中有“androidx.lifecycle.CoroutineLiveData@76f6edd”。

    要解决此问题,只需替换:

     totalSumTextView.apply {
                val totalSum = viewModel.totalSum
                text = totalSum.toString()
            }
    

    与:

    viewModel.totalSum.observe(this) { totalSumTextView.text = it}
    

    详细评论,如何使用 LiveData 你可以在这里找到: https://developer.android.com/topic/libraries/architecture/livedata

    【讨论】:

    • 感谢您的精彩解释!我添加了您的函数,但得到推断类型为 Float 的错误!但是字符序列!预料之中。我将 Dao Query 更改为 Flow,但仍然是同样的问题。有什么想法吗?
    • 没关系,一个简单的 toString() 解决了它。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    • 2018-01-28
    • 1970-01-01
    相关资源
    最近更新 更多