在 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 来做到这一点。
这是实现您想要的效果的一种简洁明了的方法。
- 对 recyclerView 和 imageButton 使用 xml 布局。 (确保使用 FrameLayout 作为根布局)
- 默认使用android:visibillity=gone to imageButton
- 像您在 onCreateView 中所做的那样扩充布局,但删除 imageButtoninflation
- 观察
OnViewCreated
中的实时数据
- 一旦你获得了一些数据然后就可以采取行动。你可以有类似
的东西
crimeListViewModel.crimeListLiveData.observe(viewLifecycleOwner) { crimes ->
if(crimes.isNullOrEmpty() {
// show imageButton
// add click listener to imageButton
} else {
// hide imageButton
// populate the recyclerView adapter with Items
} }
)
我有一个显示 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 来做到这一点。
这是实现您想要的效果的一种简洁明了的方法。
- 对 recyclerView 和 imageButton 使用 xml 布局。 (确保使用 FrameLayout 作为根布局)
- 默认使用android:visibillity=gone to imageButton
- 像您在 onCreateView 中所做的那样扩充布局,但删除 imageButtoninflation
- 观察
OnViewCreated
中的实时数据
- 一旦你获得了一些数据然后就可以采取行动。你可以有类似 的东西
crimeListViewModel.crimeListLiveData.observe(viewLifecycleOwner) { crimes ->
if(crimes.isNullOrEmpty() {
// show imageButton
// add click listener to imageButton
} else {
// hide imageButton
// populate the recyclerView adapter with Items
} }
)