从我的recyclerview中删除最后一项时获取IndexOutOfBoundsException

问题描述 投票:1回答:2

我有一个应用程序,您可以在其中收藏项目和活动,您可以在其中查看您喜欢的项目。在收藏夹活动中,您还可以删除之前收藏的项目。收藏夹活动包括一个简单的recyclerview来显示收藏的项目,当然还有一个相应的适配器,它接收收藏夹的ArrayList来填充recyclerview。我还有一个FavoritesManager类来处理收藏夹的添加和删除。我遇到的问题是,当我删除收藏夹活动中收藏夹列表中的最后一个收藏夹时,我的应用程序崩溃了,我得到了一个IndexOutOfBoundsException。以下是点击按钮从收藏夹中删除项目时运行的代码:

class FavoritesListAdapter(val context: Context, val favorites: ArrayList<FavoriteSong>) : RecyclerView.Adapter<FavoritesListAdapter.FavoriteViewHolder>() {
 override fun onBindViewHolder(holder: FavoriteViewHolder?, position: Int) {
    holder?.favoriteBtn?.setOnClickListener {
        holder.favoriteBtn?.setImageResource(R.drawable.ic_favorite_border_black_24dp)
        favorites.removeAt(holder.adapterPosition)
        notifyItemRemoved(holder.adapterPosition)
        notifyDataSetChanged()
        favoritesManger.removeFavorite(context, favorites[holder.adapterPosition])
    }
}

这是我的FavoritesManager类中的代码,用于从数据库中删除收藏夹:

fun removeFavorite(context: Context, song: FavoriteSong) {
    val favoriteSongs = getFavorites(context)
    if (favoriteSongs != null) {
        favoriteSongs.remove(song)
        saveFavorites(context, favoriteSongs)
    }
}

我已经在我的适配器中钻取问题,调用FavoriteManager类从数据库中删除收藏夹,但我无法弄清楚为什么会导致问题。我可以使用FavoritesManager类从应用程序的其他地方删除最后一项,但是当我运行那段代码时,我收到此错误:

E/UncaughtException: java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
                                                                                at java.util.ArrayList.get(ArrayList.java:437)
                                                                                at com.example.favorites.adapter.FavoritesListAdapter$onBindViewHolder$1.onClick(FavoritesListAdapter.kt:37)
                                                                                at android.view.View.performClick(View.java:6294)
                                                                                at android.view.View$PerformClick.run(View.java:24770)
                                                                                at android.os.Handler.handleCallback(Handler.java:790)
                                                                                at android.os.Handler.dispatchMessage(Handler.java:99)
                                                                                at android.os.Looper.loop(Looper.java:164)
                                                                                at android.app.ActivityThread.main(ActivityThread.java:6494)
                                                                                at java.lang.reflect.Method.invoke(Native Method)
                                                                                at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
                                                                                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

还有其他方法可以删除列表中的最后一项吗?我试图删除的项目在列表的范围内并存在于列表中,因此我不明白为什么它没有被删除。

android arraylist android-recyclerview recycler-adapter
2个回答
2
投票

尝试更新代码

 class FavoritesListAdapter(val context: Context, val favorites: ArrayList<FavoriteSong>) : RecyclerView.Adapter<FavoritesListAdapter.FavoriteViewHolder>() {
     override fun onBindViewHolder(holder: FavoriteViewHolder?, position: Int) {
        holder?.favoriteBtn?.setOnClickListener {
            holder.favoriteBtn?.setImageResource(R.drawable.ic_favorite_border_black_24dp)
            favorites.removeAt(holder.adapterPosition)
            favoritesManger.removeFavorite(context, favorites[holder.adapterPosition])
            //notifyItemRemoved(holder.adapterPosition)
            notifyDataSetChanged() 
        }
    }

0
投票

在原始代码中,我看到以下两行:

favorites.removeAt(holder.adapterPosition)
...
favoritesManger.removeFavorite(context, favorites[holder.adapterPosition])

看来你正在通过索引从favorites列表中删除一些项目,然后尝试再次查找相同的项目作为favoritesManger.removeFavorite()的第二个参数。如果holder.adapterPosition是列表中的最后一个索引,这将导致IndexOutOfBoundsException。 (即使它不是最后一个索引,你也会从不同的集合中删除两个不同的项目。)

removeAt()方法返回已删除的项目,因此您应该能够用以下内容替换这两行:

val removed = favorites.removeAt(holder.adapterPosition)
...
favoritesManger.removeFavorite(context, removed)
© www.soinside.com 2019 - 2024. All rights reserved.