我创建了一个列表视图,并用数据填充了它。我在列表中添加了一个点击侦听器,它将使列表减少2个项目并显示新列表。
但是,当我显示新列表时,我得到了ArrayIndexOutOfBoundsException。
要纠正此问题,我建立了一个if查询,询问是否已经到达列表的末尾,在这种情况下,返回模板行。有没有一种方法,我只是得到一条线而不是模板线?我认为现在插入显示的空模板行是错误的。如果我展开它们,则列表是否显示所有项目也将是一个问题。
java.lang.ArrayIndexOutOfBoundsException: length=3; index=3
at com.example.evpic.ui.main.RightFragment$MyAdapter.getView(RightFragment.kt:33)
at android.widget.AbsListView.obtainView(AbsListView.java:3271)
at android.widget.ListView.makeAndAddView(ListView.java:2238)
at android.widget.ListView.fillDown(ListView.java:838)
at android.widget.ListView.fillGap(ListView.java:801)
科特林代码:
package com.example.evpic.ui.main
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.ListView
import androidx.fragment.app.Fragment
import com.example.evpic.R
import android.content.Context
import android.widget.ArrayAdapter
import android.widget.TextView
class RightFragment : Fragment() {
internal class MyAdapter constructor(
val c: Context,
var title: Array<String>,
var description: Array<String>,
var imgs: Array<Int>
) : ArrayAdapter<String>(c, R.layout.row, R.id.textView1, title) {
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
val layoutInflater: LayoutInflater = c.applicationContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
val row: View = layoutInflater.inflate(R.layout.row, parent, false)
if(title.size > position){ //added as test
val images = row.findViewById<ImageView>(R.id.image)
val myTitle = row.findViewById<TextView>(R.id.textView1)
val myDescription = row.findViewById<TextView>(R.id.textView2)
images.setImageResource(imgs[position])
myTitle.text = title[position]
myDescription.text = description[position]
row.setOnClickListener { view ->
title = title.copyOfRange(0,title.size-2)
description = description.copyOfRange(0,description.size -2)
imgs = imgs.copyOfRange(0, imgs.size -2)
this.notifyDataSetChanged()
}
}
return row
}
}
val ada = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val root = inflater.inflate(R.layout.fragment_main, container, false)
var mTitle = arrayOf("Facebook", "Whatsapp", "Twitter", "Instagram", "Youtube")
var mDescription = arrayOf(
"Facebook Description",
"Whatsapp Description",
"Twitter Description",
"Instagram Description",
"Youtube Description"
)
var images = arrayOf(
R.drawable.o_one,
R.drawable.o_one,
R.drawable.o_one,
R.drawable.o_one,
R.drawable.o_one
)
var listView: ListView = root.findViewById(R.id.listView)
val ada: MyAdapter = MyAdapter(this.activity!!.getApplicationContext(), mTitle, mDescription, images)
listView.setAdapter(ada)
return root
}
companion object {
private const val ARG_SECTION_NUMBER = "section_number"
@JvmStatic
fun newInstance(sectionNumber: Int): RightFragment {
return RightFragment().apply {
arguments = Bundle().apply {
putInt(ARG_SECTION_NUMBER, sectionNumber)
}
}
}
}
}