在 onCreateView 上获取数据库

Getting the DATABASE Upon onCreateView

我有一个显示 recyclerview 小部件的片段

当列表为空时,我想在中间显示一个图像按钮,告诉用户添加内容。

我linkonCreateView中的视图是这样

override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {

            val view : View
            val repository = CrimeRepository.get()
            val crimes : LiveData<List<Crime>> = repository.getCrimes()


            if (crimes.value?.isEmpty() == true){

            view= inflater.inflate(R.layout.fragment_crime_list, container, false)
              crimeRecyclerView =
                view?.findViewById(R.id.crime_recycler_view) as RecyclerView
            crimeRecyclerView?.layoutManager= LinearLayoutManager(context)
        } else{
               view = inflater.inflate(R.layout.empty_layout, container, false)
                imageButton = view.findViewById(R.id.imageButton) as ImageButton

                imageButton.setOnClickListener{
                    val crime = Crime()
                    crimeListViewModel.addCrime(crime)
                    callbacks?.onCrimeSelected(crime.id)
                }
        }

        return view
    }

我的问题是获取犯罪列表的大小...我只能获取 .value,即使它为空也永远不会为 null...

通常我通过这种方式在 onViewCreated 中获取它

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        crimeListViewModel.crimeListLiveData.observe(
            viewLifecycleOwner,
            Observer { crimes ->
                crimes?.let {
                    Log.i(TAG, "Got Crimes ${crimes.size}")
                    updateUI(crimes)
                }
            }
        )
    }

我尝试在 onCreateView 中做同样的事情,但从未奏效...也许我找不到制作代码的正确方法...

当我获取数据时,我可以检查大小是否为零...

有什么解决办法吗?

i only can get .value and that is never null even if it is empty...

这是因为操作是异步的,这意味着您必须等待才能访问犯罪列表的实际值。您可以通过使用您已经使用但方式不正确的 observe 来做到这一点。

这是实现您想要的效果的一种简洁明了的方法。

  1. 对 recyclerView 和 imageButton 使用 xml 布局。 (确保使用 FrameLayout 作为根布局)
  2. 默认使用android:visibillity=gone to imageButton
  3. 像您在 onCreateView 中所做的那样扩充布局,但删除 imageButtoninflation
  4. 观察OnViewCreated
  5. 中的实时数据
  6. 一旦你获得了一些数据然后就可以采取行动。你可以有类似
  7. 的东西

crimeListViewModel.crimeListLiveData.observe(viewLifecycleOwner) { crimes ->
                if(crimes.isNullOrEmpty() {
                   // show imageButton
                   // add click listener to imageButton
                } else {
                  // hide imageButton
                  // populate the recyclerView adapter with Items
                }            }
        )