【发布时间】:2020-11-30 11:18:16
【问题描述】:
我正在开发一个应用程序作为培训。目前,如果互联网连接可用,它会调用 api 并将数据加载到 Room,同时 UI 会显示来自 Room 的数据。首次启动后它工作正常,但是当我将它安装到新的设备模拟器等或重新安装它时。它在第一次启动时不显示数据,但如果我关闭它并再次打开。它继续正常工作。我该如何解决这个问题? 这是我的代码:
CityDao
interface CityDao {
@Insert(onConflict = OnConflictStrategy.IGNORE)
suspend fun addCity(cityRm: CityRm)
@Query("SELECT * FROM city_table ORDER BY cId ASC")
suspend fun readAllCities(): List<CityRm>
}
CityRoomRepository
class CityRoomRepository(private val cityDao: CityDao) {
suspend fun readAllCities(): List<CityRm> {
return cityDao.readAllCities()
}
suspend fun addCity(cityRm: CityRm) {
cityDao.addCity(cityRm)
}
}
城市模型视图
class CityRmViewModel (application: Application):AndroidViewModel(application) {
val allCities = MutableLiveData<List<CityRm>>()
private val cityDao = EventsDatabase.getEventsDatabase(application).cityDao()
private val eventDao = EventsDatabase.getEventsDatabase(application).eventDao()
private val cityRoomRepository: CityRoomRepository = CityRoomRepository(cityDao)
private val cityRepository: CityRepository = CityRepository()
private val eventRepository: EventListRepository = EventListRepository()
private val eventRoomRepository: EventsRoomRepository = EventsRoomRepository(eventDao)
init {
viewModelScope.launch(Main) {
val cities = cityRoomRepository.readAllCities()
allCities.value = cities
}
viewModelScope.launch(IO) {
try {
if (InternetConnectionCheck(application)) {
callCityApi(cityRepository, cityRoomRepository)
}
} catch (e: Exception) {
Log.e("internet connection check error ", e.toString())
}
}
viewModelScope.launch(IO) {
try {
if (InternetConnectionCheck(application)) {
callEventApi(eventRepository, eventRoomRepository)
}
} catch (e: Exception) {
Log.e("internet connection check error ", e.toString())
}
}
}
suspend fun loadData() {
val cities = cityRoomRepository.readAllCities()
allCities.value = cities
}
}
城市碎片
class citySelectionPage : Fragment() {
lateinit var cityViewModel: CityRmViewModel
private val cityAdapter = cityScPageAdapter(arrayListOf())
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val view = inflater.inflate(R.layout.fragment_city_selection_page, container, false)
cityViewModel = ViewModelProvider(this).get(CityRmViewModel::class.java)
lifecycleScope.launch(Main) {
cityViewModel.loadData()
}
val recyclerView = view.cityPageRecycler
recyclerView.apply {
layoutManager = LinearLayoutManager(activity)
adapter = cityAdapter
}
observeViewModel()
return view
}
fun observeViewModel(){
cityViewModel.allCities.observe(viewLifecycleOwner, { cities ->
cities?.let {
cityAdapter.updateCities(it)
}
})
}
}
城市适配器
class cityScPageAdapter(var myCities: ArrayList<CityRm>) :
RecyclerView.Adapter<cityScPageAdapter.cityScPageViewHolder>() {
fun updateCities(newCities: List<CityRm>) {
myCities.clear()
myCities.addAll(newCities)
notifyDataSetChanged()
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): cityScPageViewHolder {
return cityScPageViewHolder(
LayoutInflater.from(parent.context).inflate(R.layout.item_cities, parent, false)
)
}
override fun onBindViewHolder(holder: cityScPageViewHolder, position: Int) {
holder.itemView.setOnClickListener {
SingletonCityID.cityID = myCities[position].cId
val action = citySelectionPageDirections.goToEventListPage()
Navigation.findNavController(it).navigate(action)
}
holder.bind(myCities[position])
}
override fun getItemCount(): Int {
Log.d("live data size",myCities.size.toString())
return myCities.size
}
class cityScPageViewHolder(view: View): RecyclerView.ViewHolder(view){
private val cityName = view.findViewById<TextView>(R.id.cityName)
fun bind(myCity: CityRm) {
cityName.text = myCity.name
}
}
}
编辑:当我使用 LiveData 而不是 List 时出错,如果我尝试使用 MutableLiveData(对于 CityRm、Dao 和 Repository)也会得到相同的错误日志
【问题讨论】:
-
我们可以查看您的适配器代码吗?如果您调试此行是否会命中
cityAdapter.updateCities(it)? -
@DavidKroukamp 我已经添加了适配器代码并尝试了调试,它成功了,但“it”参数是“0”
标签: android android-room android-livedata