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)
}