为什么我的 SharedViewModel 先执行?
why my SharedViewModel is Executing first?
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
val view = inflater.inflate(R.layout.fragment_list, container, false)
val recyclerView = view.findViewById<RecyclerView>(R.id.recyclerView)
recyclerView.adapter = adapter
recyclerView.layoutManager = LinearLayoutManager(requireActivity())
noDataTextView = view.findViewById(R.id.no_data_textView)
noDataImageView = view.findViewById(R.id.no_data_imageView)
mToDoViewModel.getAllData.observe(viewLifecycleOwner, Observer { data ->
adapter.setData(data)
mSharedViewModel.checkIfDatabaseEmpty(data)
})
floatingActionButton = view.findViewById<FloatingActionButton>(R.id.floatingActionButton)
listLayout = view.findViewById(R.id.listLayout)
floatingActionButton.setOnClickListener {
findNavController().navigate(R.id.action_listFragment_to_addFragment)
}
//set menu
setHasOptionsMenu(true)
mSharedViewModel.emptyDatabase.observe(viewLifecycleOwner, Observer { data ->
showEmptyDatabaseViews(data)
})
return view
}
我有一个可见性系统,如果数据库为空,就会显示图像。
但是当我 运行 代码首先显示图像然后显示数据然后我调试它并看到 mSharedViewModel.emptyDatabase.observe()函数是运行ning先?这里的主要问题是什么,
ps,我正在使用悬浮乐趣加载数据
编辑 1:
我的默认可见性是不可见的
<ImageView>
.
.
android:visibility="invisible"
这是我的 ShareViewModel Class 它将检查数据库是否为空
class SharedViewModel(application: Application) : AndroidViewModel(application) {
val emptyDatabase: MutableLiveData<Boolean> = MutableLiveData(true)
fun checkIfDatabaseEmpty(toDoData: List<ToDoData>){
emptyDatabase.value=toDoData.isEmpty()
}
这是我的 ViewModel
class ToDoViewModel(application: Application):AndroidViewModel(application) {
private val toDoDao= ToDoDatabase.getDatabase(application).ToDoDao()
private val repository:ToDoRepository
val getAllData: LiveData<List<ToDoData>>
init {
repository=ToDoRepository(toDoDao)
getAllData=repository.getAllData
}
您的期望:
我有一个可见性系统,如果数据库为空,则显示图像。
根据您的代码:
android:visibility="invisible"
默认可见性是 invisible
没问题,但请检查视图模型代码
val emptyDatabase: MutableLiveData<Boolean> = MutableLiveData(true)
您将值设置为 true
。所以当任何 observer
开始 observing
更改时,default value
将传递给 observer
,所以逻辑上你的代码是 OK
,数据库是 empty
图像视图是 visible
.
因此,您应该将 false
设置为 default value
。
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
val view = inflater.inflate(R.layout.fragment_list, container, false)
val recyclerView = view.findViewById<RecyclerView>(R.id.recyclerView)
recyclerView.adapter = adapter
recyclerView.layoutManager = LinearLayoutManager(requireActivity())
noDataTextView = view.findViewById(R.id.no_data_textView)
noDataImageView = view.findViewById(R.id.no_data_imageView)
mToDoViewModel.getAllData.observe(viewLifecycleOwner, Observer { data ->
adapter.setData(data)
mSharedViewModel.checkIfDatabaseEmpty(data)
})
floatingActionButton = view.findViewById<FloatingActionButton>(R.id.floatingActionButton)
listLayout = view.findViewById(R.id.listLayout)
floatingActionButton.setOnClickListener {
findNavController().navigate(R.id.action_listFragment_to_addFragment)
}
//set menu
setHasOptionsMenu(true)
mSharedViewModel.emptyDatabase.observe(viewLifecycleOwner, Observer { data ->
showEmptyDatabaseViews(data)
})
return view
}
我有一个可见性系统,如果数据库为空,就会显示图像。 但是当我 运行 代码首先显示图像然后显示数据然后我调试它并看到 mSharedViewModel.emptyDatabase.observe()函数是运行ning先?这里的主要问题是什么,
ps,我正在使用悬浮乐趣加载数据
编辑 1: 我的默认可见性是不可见的
<ImageView>
.
.
android:visibility="invisible"
这是我的 ShareViewModel Class 它将检查数据库是否为空
class SharedViewModel(application: Application) : AndroidViewModel(application) {
val emptyDatabase: MutableLiveData<Boolean> = MutableLiveData(true)
fun checkIfDatabaseEmpty(toDoData: List<ToDoData>){
emptyDatabase.value=toDoData.isEmpty()
}
这是我的 ViewModel
class ToDoViewModel(application: Application):AndroidViewModel(application) {
private val toDoDao= ToDoDatabase.getDatabase(application).ToDoDao()
private val repository:ToDoRepository
val getAllData: LiveData<List<ToDoData>>
init {
repository=ToDoRepository(toDoDao)
getAllData=repository.getAllData
}
您的期望: 我有一个可见性系统,如果数据库为空,则显示图像。
根据您的代码:
android:visibility="invisible"
默认可见性是 invisible
没问题,但请检查视图模型代码
val emptyDatabase: MutableLiveData<Boolean> = MutableLiveData(true)
您将值设置为 true
。所以当任何 observer
开始 observing
更改时,default value
将传递给 observer
,所以逻辑上你的代码是 OK
,数据库是 empty
图像视图是 visible
.
因此,您应该将 false
设置为 default value
。