Android 从recyclerview中删除项目错误如何解决? class AdapterClass:RecyclerView.Adapter(){ var indixepersonas:MutableList=ArrayList() lateinit变量上下文:上下文 有趣的构造函数(person:MutableList,context:context){ this.indixepersonas=个人 this.context=context } 乐趣移除(位置:Int){ indixepersonas.removeAt(位置) 已删除的项目(位置) notifyDataSetChanged() } override fun onCreateViewHolder(父级:ViewGroup,viewType:Int):ViewHolder{//gonfia val layoutInflater=layoutInflater.from(parent.context) 返回视窗支架(布局更平坦。充气(R.layout.items,父项,false)) } 重写getItemCount():Int{ 返回indixepersonas.size notifyDataSetChanged() } 覆盖BindViewHolder(holder:ViewHolder,位置:Int){ val item=indexpersonas.get(位置) 持有者绑定(项目、上下文) } 内部类ViewHolder(视图:视图):RecyclerView.ViewHolder(视图){ val nonbre=view.findViewById(R.id.nonbre)作为TextView val apellido=view.findViewById(R.id.apellido)作为TextView var clikc=view.apply{ setOnLongClickListener{ getItemId() showContextMenu() } } 趣味绑定(modelar:Modello,context:context){ nonbre.text=modelar.nome apellido.text=modelar.cogonome } } }

Android 从recyclerview中删除项目错误如何解决? class AdapterClass:RecyclerView.Adapter(){ var indixepersonas:MutableList=ArrayList() lateinit变量上下文:上下文 有趣的构造函数(person:MutableList,context:context){ this.indixepersonas=个人 this.context=context } 乐趣移除(位置:Int){ indixepersonas.removeAt(位置) 已删除的项目(位置) notifyDataSetChanged() } override fun onCreateViewHolder(父级:ViewGroup,viewType:Int):ViewHolder{//gonfia val layoutInflater=layoutInflater.from(parent.context) 返回视窗支架(布局更平坦。充气(R.layout.items,父项,false)) } 重写getItemCount():Int{ 返回indixepersonas.size notifyDataSetChanged() } 覆盖BindViewHolder(holder:ViewHolder,位置:Int){ val item=indexpersonas.get(位置) 持有者绑定(项目、上下文) } 内部类ViewHolder(视图:视图):RecyclerView.ViewHolder(视图){ val nonbre=view.findViewById(R.id.nonbre)作为TextView val apellido=view.findViewById(R.id.apellido)作为TextView var clikc=view.apply{ setOnLongClickListener{ getItemId() showContextMenu() } } 趣味绑定(modelar:Modello,context:context){ nonbre.text=modelar.nome apellido.text=modelar.cogonome } } },android,kotlin,android-recyclerview,Android,Kotlin,Android Recyclerview,主要活动: class AdapterClass:RecyclerView.Adapter<AdapterClass.ViewHolder>() { var indixepersonas:MutableList<Modello> = ArrayList() lateinit var context:Context fun constructor(person: MutableList<Modello>, context: Context

主要活动:

class AdapterClass:RecyclerView.Adapter<AdapterClass.ViewHolder>() {
    var indixepersonas:MutableList<Modello> = ArrayList()
    lateinit var context:Context
  fun   constructor(person: MutableList<Modello>, context: Context)  {
        this.indixepersonas = person
        this.context = context
    }
   fun remove(position: Int){
       indixepersonas.removeAt(position)
       notifyItemRemoved(position)
       notifyDataSetChanged()
   }
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { //gonfia
        val layoutInflater=LayoutInflater.from(parent.context)
        return ViewHolder(layoutInflater.inflate(R.layout.items, parent, false))
    }

    override fun getItemCount(): Int {
        return indixepersonas.size
        notifyDataSetChanged()
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val item=indixepersonas.get(position)
        holder.bind(item,context)

    }
    inner class ViewHolder(view: View):RecyclerView.ViewHolder(view){

        val nonbre=view.findViewById(R.id.nonbre)as TextView
        val apellido=view.findViewById(R.id.apellido) as TextView
        var clikc=view.apply {

            setOnLongClickListener {
                getItemId()
                showContextMenu()

            }

        }
        fun bind(modelar:Modello ,context:Context){
            nonbre.text=modelar.nome
            apellido.text=modelar.cogonome
        }

    }
}
class MainActivity:AppCompatActivity(){
lateinit var mRecyclerView:RecyclerView
val适配器:适配器类=适配器类()
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
getPersonas()
设置回收器()
registerForContextMenu(mRecyclerView)
}
趣味设置回收器(){
mRecyclerView=findViewById(R.id.recyclerview)作为recyclerview
mRecyclerView.setHasFixedSize(true)
mRecyclerView.layoutManager=LinearLayoutManager(此)
构造函数(getPersonas(),this)
mRecyclerView.adapter=适配器
}
fun getPersonas():可变列表{//crea数组
var indixepersonas:MutableList=ArrayList()
添加(Modello(“angelo”、“ferretti”))
添加(Modello(“angio”、“ferretti”))
添加(Modello(“阿德马罗”、“费雷蒂”))
回归独立人格
}
覆盖onCreateContextMenu(
菜单:上下文菜单?,
v:视图?,
menuInfo:ContextMenu.ContextMenuInfo?
) {
var m=菜单充气器充气(R.menu.menu,menu)
super.onCreateContextMenu(menu,v,menuInfo)
}
覆盖onContextItemSelected(项:MenuItem):布尔值{
时间(item.itemId){
R.id.remover->{
adapter.remove(item.itemId)}
}
返回真值}
}
错误:

java.lang.IndexOutOfBoundsException:索引:2131165321,大小:3/////out of Index

item.itemId没有为我提供正确的索引?位于com.example.delatetext.AdapterClass.remove(AdapterClass.kt:19)的java.util.ArrayList.remove(ArrayList.java:503)在com.example.delatetext.MainActivity.onContextItemSelected(MainActivity.kt:50)在androidx.fragment.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:384)的android.app.Activity.onMenuItemSelected(Activity.java:3563)在androidx.appcompat.app.AppCompatActivity.onMenuItemSelected(AppCompatActivity.java:219)在androidx.appcompat.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java)处


在这里的
适配器中传递要删除的索引。删除(item.itemId)
,将
item.itemId
替换为要删除的项的索引,因为此
项。itemId
返回菜单项的自动生成id

您的崩溃发生在
适配器的行上。删除(item.itemId)}
。原因是适配器方法处于某个位置,但您正在传递菜单项的内部id。从苹果到橙子。由于您似乎只有一个指定要删除的菜单项,因此您需要有某种方法知道应该删除哪个数据项。这可能是当前列表中的最后一项,也可能不是AKE用户输入。无论您如何确定,都要将适当的位置传递给适配器

注意:您的适配器也应该在
remove
方法中进行修改。当前,它将应用程序暴露于
ConcurrentModificationException
(想象一下,如果调用remove方法时此人正在滚动列表,适配器可能会尝试绑定不存在的数据)。以下是另一种方法:

 class MainActivity : AppCompatActivity() {
        lateinit var mRecyclerView: RecyclerView
        val adapter: AdapterClass = AdapterClass()
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            getPersonas()
            settingRecycler()
            registerForContextMenu(mRecyclerView)
        }
    
        fun settingRecycler() {
            mRecyclerView = findViewById(R.id.recyclerview) as RecyclerView
            mRecyclerView.setHasFixedSize(true)
            mRecyclerView.layoutManager = LinearLayoutManager(this)
            adapter.constructor(getPersonas(), this)
            mRecyclerView.adapter = adapter
        }
    
        fun getPersonas(): MutableList<Modello> { //crea array
            var indixepersonas: MutableList<Modello> = ArrayList()
            indixepersonas.add(Modello("angelo", "ferretti"))
            indixepersonas.add(Modello("angio", "ferretti"))
            indixepersonas.add(Modello("ademaro", "ferretti"))
            return indixepersonas
        }
    
    
        override fun onCreateContextMenu(
            menu: ContextMenu?,
            v: View?,
            menuInfo: ContextMenu.ContextMenuInfo?
        ) {
            var m = menuInflater.inflate(R.menu.menu, menu)
            super.onCreateContextMenu(menu, v, menuInfo)
        }
        override fun onContextItemSelected(item: MenuItem): Boolean {
            when (item.itemId) {
                R.id.remover -> {
                    adapter.remove( item.itemId) }
            }
            return true }
    }

注意,我还删除了
notifyDataSetChanged()
调用,因为这与
notifyItemRemoved
调用是多余的。

2131165321是R文件中的菜单项id,而不是列表中项目的索引。您应该将项目单击侦听器添加到适配器类中。Holder类中的方法getAdapterPosition应该帮助您获取长按项目的索引。我使用ur fun remove但是我必须更改oncontexmenuitemselect中的某些内容吗?仍然是相同的错误::::////重写fun onContextItemSelected(item:MenuItem):布尔{when(item.itemId){R.id.remover->{adapter.remove(item.itemId)}}返回true}///////fun remove(position:Int){val newList=ArrayList(indixepersonas)。还有{it.removeAt(position)}indixepersonas=newList notifyItemRemoved(position)}是-正如我所说,在onContextItemSelected方法中,您需要一种方法来标识要删除的项的位置。
item.itemId
是否
fun remove(position: Int){
    val newList = ArrayList(indixepersonas).also { it.removeAt(position) }
    indixepersonas = newList
    notifyItemRemoved(position)
}