gpt4 book ai didi

android - 从 View 模型中删除检查表是否为空的 UI 元素

转载 作者:行者123 更新时间:2023-12-02 13:30:52 25 4
gpt4 key购买 nike

好的,我会尽量保持简单。我正在编写一个应用程序,其中一个 fragment 包含一个 recyclerview,它显示 Room 表内的元素。当表格为空时,我应该显示一个占位符。

我对 MVVM 很陌生,但我尝试遵循的方法是将占位符添加到布局中(一个简单的 TextView ),如果表格不为空,则将其从布局中删除。问题是,每次确定表是否为空的尝试都没有奏效。我尝试的是:

  • 在 DAO(下面的代码)中有一个简单的查询,并在 viewmodel 中调用它。然后从 viewmodel 我使用 fragment 本身中的函数。由于我认为执行时间的原因,这种方法不起作用,因为 viewmodel 函数使用协程来正常工作
  • 尝试使用 recyclerview 适配器及其 getItemCount 方法,但它总是返回 0

  • 所以基本上我很努力地在数据库为空时简单地从布局中删除 TextView ,同时避免违反 MVVM 原则。这是一些有用的代码

    DAO函数
    @Query("SELECT * FROM Event LIMIT 1")
    fun getAnyEvent(): EventResult?

    View 模型函数
    fun getAnyEvent() = viewModelScope.launch(Dispatchers.Default) {
    eventDao.getAnyEvent()
    }

    第一种非工作方式
    if (homeViewModel.getAnyEvent() != null) {
    val homeMain: LinearLayout = v.findViewById(R.id.homeMain)
    val placeholder: TextView = v.findViewById(R.id.noEvents)
    homeMain.removeView(placeholder)
    }

    适配器
    class EventAdapter internal constructor(context: Context) : RecyclerView.Adapter<EventAdapter.EventViewHolder>() {
    private var events = emptyList<EventResult>() // Cached copy of events
    private val appContext = context

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): EventViewHolder {
    return EventViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.event_row, parent, false))
    }

    override fun onBindViewHolder(holder: EventViewHolder, position: Int) {
    val current = events[position]
    holder.setUpView(event = current)
    }

    inner class EventViewHolder (view: View) : RecyclerView.ViewHolder(view), View.OnClickListener {
    private val favoriteButton: ImageView = view.favoriteButton
    private val eventPerson: TextView = view.eventPerson
    private val eventDate: TextView = view.eventDate
    private val eventYears: TextView = view.eventYears

    init {
    view.setOnClickListener(this)
    }

    // Set every necessary text and click action in each row
    fun setUpView(event: EventResult?) {
    val personName = event?.name + " " + event?.surname
    val formatter: DateTimeFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL)
    val nextDate = event?.nextDate?.format(formatter)
    val nextAge = appContext.getString(R.string.next_age_years) + ": " + (event?.nextDate?.year?.minus(event.originalDate.year)).toString()
    eventPerson.text = personName
    eventDate.text = nextDate
    eventYears.text = nextAge

    override fun onClick(v: View?) {
    println("test")
    }
    }

    internal fun setEvents(events: List<EventResult>) {
    this.events = events
    notifyDataSetChanged()
    }

    override fun getItemCount() = events.size

    }

    我应该使用什么方法?使用这种模式我做错了什么?
    作为旁注,recyclerview 有效,我已经在使用 livedata 来正确观察变化。

    最佳答案

    您似乎只需要一个 - 在您的 fragment 中知道您的 db-query 是否返回 0 条或更多条记录。您是否尝试过为此使用 LiveData(没有协程)? (你提到了,但不清楚)

  • 你的 DAO 应该返回 LiveData-value。通过这个房间,“开箱即用”将以在线模式(当然,在后台线程中)获取您的 ViewModel 实际查询结果。
  • fun getAnyEvent(): LiveData<List<EventResult>>
  • 在您的 ViewModel 中,您也可以使用 LiveData 声明字段
  • val eventResult: LiveData<List<EventResult>> = eventDao.getAnyEvent()
  • 在您的 fragment 中,您只需观察您的 eventResult 并且您可以根据列表大小对您的 UI 做任何您想做的事情(如果它是 0,则删除您的 View stub )homeViewModel.eventResult.observe(viewLifecycleOwner, Observer { eventList -> yourAdapter.setEvents(eventList)})

  • Here是谷歌的代码实验室,里面有所有这些东西,例如

    关于android - 从 View 模型中删除检查表是否为空的 UI 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61388621/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com