#android #kotlin #android-recyclerview #android-room
Вопрос:
У меня есть этот фрагмент, в котором я храню свои «любимые предметы», и я могу удалить их, когда нажму на кнопку, если захочу. Реализация работает хорошо, пока я не дойду до последнего элемента, и он не исчезнет, если я не перейду к другому фрагменту, а затем не вернусь (например, элемент удален, но вид переработчика все еще показывает его, если я сам не обновлю фрагмент).
Как я могу заставить последний предмет исчезнуть сразу? Настройка notifyDataSetChanged() после удаления обработчика в адаптере, похоже, не работает.
Это фрагмент, где у меня есть предметы:
class FavoritesFragment : Fragment() { private val mfavoriteViewModel by viewModelslt;FavoriteViewModelgt;() private lateinit var binding: FragmentFavoritesBinding private val deleteHandler: (Favorites) -gt; Unit = { mfavoriteViewModel.deleteFavorite(it) } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?, ): View { binding = FragmentFavoritesBinding.inflate(layoutInflater) //recyclerview val adapter = FavoritesAdapter(deleteHandler) binding.rvFavList.layoutManager = LinearLayoutManager(context) binding.rvFavList.adapter = adapter //favoriteViewModel mfavoriteViewModel.readAllData.observe(viewLifecycleOwner, { favorite -gt; if (favorite.isEmpty()) { binding.emptyState.text = getString(R.string.emptyState) binding.emptyState.visibility = View.VISIBLE } else { adapter.setData(favorite) binding.emptyState.visibility = View.GONE } }) return binding.root } }
Адаптер:
class FavoritesAdapter(val deleteHandler: (Favorites) -gt; Unit) : RecyclerView.Adapterlt;FavoritesAdapter.ViewHoldergt;() { private var favoriteList = emptyListlt;Favoritesgt;() class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { private val binding = FavItemBinding.bind(itemView) val favTitle: TextView = binding.tvFavsTitle val favItem: ImageButton = binding.btnFavs val favImg: ImageView = binding.ivFavs fun bind(favorites: Favorites) { Picasso.get().load(favorites.image).into(favImg) favTitle.text = favorites.title } } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { return ViewHolder( LayoutInflater.from(parent.context).inflate(R.layout.fav_item, parent, false) ) } override fun onBindViewHolder(holder: ViewHolder, position: Int) { holder.bind(favoriteList[position]) //delete favorite item holder.favItem.setOnClickListener { deleteHandler(favoriteList[position]) } } override fun getItemCount(): Int { return favoriteList.size } fun setData(favorite: Listlt;Favoritesgt;) { this.favoriteList = favorite notifyDataSetChanged() } }
Это модель просмотра фаворита:
class FavoriteViewModel(application: Application) : AndroidViewModel(application) { val readAllData: LiveDatalt;Listlt;Favoritesgt;gt; private val repository: FavoritesRepository init { val favoriteDao = FavoriteDatabase.getDatabase(application).favoriteDao() repository = FavoritesRepository(favoriteDao) readAllData = repository.readAllData } fun addFavorite(favorite: Favorites) { viewModelScope.launch(Dispatchers.IO) { repository.addFavorite(favorite) } } fun deleteFavorite(favorite: Favorites) { viewModelScope.launch(Dispatchers.IO) { repository.deleteFavorite(favorite) } } fun deleteAllFavorites() { viewModelScope.launch(Dispatchers.IO) { repository.deleteAllFavorites() } } }
Ответ №1:
Здесь, в вашем наблюдателе:
mfavoriteViewModel.readAllData.observe(viewLifecycleOwner, { favorite -gt; if (favorite.isEmpty()) { binding.emptyState.text = getString(R.string.emptyState) binding.emptyState.visibility = View.VISIBLE } else { adapter.setData(favorite) binding.emptyState.visibility = View.GONE } })
Когда список переходит от одного элемента к нулю, в блоке if вы показываете пустое сообщение, но вам не удается обновить данные адаптера или скрыть просмотр вторичной переработки, чтобы он продолжал показывать то, что делал раньше. Вы должны выйти за adapter.setData(favorite)
пределы if/else.
Ответ №2:
Очистите свой список избранного, прежде чем устанавливать в нем новые элементы. Вы можете сделать это в своей setData()
функции. Подобный этому,
fun setData(favorite: Listlt;Favoritesgt;) { if (favouriteList.isNotEmpty()) { favouriteList.clear() } this.favoriteList = favorite notifyDataSetChanged() }