Kotlin:添加到列表视图

时间:2020-07-25 06:21:10

标签: android kotlin

我创建了一个列表视图,并用数据填充了它。我在列表中添加了一个点击侦听器,它将使列表减少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)
                }
            }
        }
    }
}

0 个答案:

没有答案