У меня есть ViewPager с одной вкладкой, которая извлекает данные из комнаты через ViewModel с объектами LiveData.
Когда я переключаюсь на любую вкладку и возвращаюсь на одну, отображается список элементоввсе работает идеально, но, исходя из фона, я не знаю, почему, но я получаю на один список меньше.
например, когда я впервые вхожу в «Фрагмент списка».Я извлекаю данные из 5 различных объектов, и отображаются 5 элементов спискаПерейти к фону и вернуться к «Фрагмент списка»4 списка имеют данные, но 1 пустПерейти к фону и вернуться к «Фрагмент списка»3 списка имеют данные, но 2 пусты... пока полностью не пусто, но затем я переключаю вкладки и список хорошо заполнен
Спасибо за любую помощь.
ViewModel
class TagsViewModel(application: Application) : AndroidViewModel(application) {
private var repository: TagsRepository = TagsRepository(application)
private var listText: LiveData<List<Text>> = repository.getAllText()
private var listUrl: LiveData<List<Url>> = repository.getAllUrl()
private var listEmail: LiveData<List<Email>> = repository.getAllEmail()
private var listPhone: LiveData<List<Phone>> = repository.getAllPhone()
private var listLauncher: LiveData<List<Launcher>> = repository.getAllLauncher()
fun getData(): List<BaseTag>{
var allData= mutableListOf<BaseTag>()
if (listText.value != null){
listText.value!!.forEach {
allData.add(it)
}
}
if (listUrl.value != null){
listUrl.value!!.forEach {
allData.add(it)
}
}
if (listEmail.value != null){
listEmail.value!!.forEach {
allData.add(it)
}
}
if (listPhone.value != null){
listPhone.value!!.forEach {
allData.add(it)
}
}
if (listLauncher.value != null){
listLauncher.value!!.forEach {
allData.add(it)
}
}
return allData
}
//-------TEXT--------
fun insertText(text: Text) {
repository.insertText(text)
}
fun deleteTextByID(id: Int) {
repository.deleteTextByID(id)
}
fun getAllText(): LiveData<List<Text>> {
return listText
}
fun deleteAllText() {
repository.deleteAllText()
}
репозиторий getAllText () возвращает tagsDao.getTextList ()и Дао:
@Query("SELECT * FROM Text")
fun getTextList(): LiveData<List<Text>>
РЕДАКТИРОВАТЬ
Я изменил viewPager, чтобы не создавать заново фрагменты снова, наблюдая LiveData в onViewCreated, очищая список в onPause и устанавливая данныеснова в onResume и добавление viewLyfeCycleOwner
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
v = inflater.inflate(R.layout.fragment_my_tags, container, false)
return v
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
setupUI()
}
private fun setupUI(){
val recyclerView = v.findViewById<RecyclerView>(R.id.recycler_view)
recyclerView.layoutManager = LinearLayoutManager(context)
recyclerView.setHasFixedSize(true)
recyclerView.adapter = adapter
tagsViewModel = ViewModelProviders.of(this).get(TagsViewModel::class.java)
getTags()
(activity as MainActivity).mToolbar.onMenuItemClick {
when (it!!.itemId){
R.id.btnDeleteAll -> toast("sort")
R.id.btnOrderBy -> tagsViewModel.deleteAll()
}
}
}
private fun getTags(){
tagsViewModel.getAllText().observe(viewLifecycleOwner,
Observer<List<Text>> { t -> adapter.setTags(t!!) })
tagsViewModel.getAllEmail().observe(viewLifecycleOwner,
Observer<List<Email>> { t -> adapter.setTags(t!!) })
tagsViewModel.getAllUrl().observe(viewLifecycleOwner,
Observer<List<Url>> { t -> adapter.setTags(t!!) })
tagsViewModel.getAllPhone().observe(viewLifecycleOwner,
Observer<List<Phone>> { t -> adapter.setTags(t!!) })
tagsViewModel.getAllLauncher().observe(viewLifecycleOwner,
Observer<List<Launcher>> { t -> adapter.setTags(t!!) })
}
override fun onPause() {
adapter.clear()
super.onPause()
}
override fun onResume() {
adapter.setTags(tagsViewModel.getData())
super.onResume()
}
и он работает так же, как и раньше, когда я возвращаюсь из фона в onResume, моя viewModel всегда возвращает на один список меньше, что совершенно случайно, иногда textList, иногда emailList ... Почему это так?потерять свои данные?Понятия не имею, почему.
Редактировать 2
class TagsAdapter : RecyclerView.Adapter<TagsAdapter.TagHolder>() {
private var baseList: MutableList<BaseTag> = ArrayList()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TagHolder {
val itemView = LayoutInflater.from(parent.context)
.inflate(R.layout.tag_item, parent, false)
return TagHolder(itemView)
}
override fun onBindViewHolder(holder: TagHolder, position: Int) {
val tag = baseList[position]
holder.tvAlias.text = tag.content
holder.tvDate.text = tag.date?.let { AppUtils.toDate(it) }
holder.ivType.background = tag.type?.let { getDrawable(it) }
}
override fun getItemCount(): Int {
return baseList.size
}
fun setTags(list: List<BaseTag>) {
if (this.baseList.isEmpty()) {
this.baseList = list as MutableList<BaseTag>
} else {
this.baseList.addAll(list)
}
orderList()
notifyDataSetChanged()
}
private fun getDrawable(type: String): Drawable? {
when (type) {
AppConstants.TYPE_TEXT -> return ContextCompat.getDrawable(App.instance, R.drawable.ic_text)
AppConstants.TYPE_EMAIL -> return ContextCompat.getDrawable(App.instance, R.drawable.ic_write)
AppConstants.TYPE_URL -> return ContextCompat.getDrawable(App.instance, R.drawable.ic_clean)
AppConstants.TYPE_PHONE -> return ContextCompat.getDrawable(App.instance, R.drawable.ic_mobile)
AppConstants.TYPE_LAUNCHER -> return ContextCompat.getDrawable(App.instance, R.drawable.ic_code)
}
return null
}
private fun orderList(){
baseList.sortBy { it.date }
baseList.reverse()
}
fun clear(){
this.baseList.clear()
}
inner class TagHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
var tvAlias: TextView = itemView.findViewById(R.id.txtAlias)
var tvDate: TextView = itemView.findViewById(R.id.txtDate)
var ivType: ImageView = itemView.findViewById(R.id.ivType)
}
}