2

This is the variables and addControl fun I used.

var arrayTQ = ArrayList<TongQuan>()
var arrayBG = ArrayList<BangGia>()
var epdbLV: ExpandableListView? = null
var listHeader: List<String> = listOf()
var listChild = HashMap<String, ArrayList<Any>>()

var arrayListData = ArrayList<String>()
private fun addControl() {
    epdbLV = findViewById(R.id.epdbList)
    listHeader = ArrayList()
    listChild = HashMap<String, ArrayList<Any>>()
    listHeader = listOf("Tổng Quan Thị Quan Thị Trường, Bảng Giá, Lịch Sự Kiện, Tin Tức, Chỉ Số Thế Giới")
    arrayListData = ArrayList()
    arrayTQ = ArrayList()
    arrayBG = ArrayList()
}

And I put the listChild.put into override fun in inner class GetData extend AsyncTask. The error at arrayTQ is about the type of data TongQuan not match with Any. In Java, It is no need to add typedata after ArrayList in HashMap. Help me fix it, I had searched and tried. Thanks Guys.

override fun onPostExecute(result: ArrayList<String>) {
        super.onPostExecute(result)
        getDataTQ()
        getDataBG()
        listChild.clear()
        listChild.put(listHeader.get(1), arrayTQ)
    }

2 Answers 2

3

ArrayList<TongQuan> is not a child of ArrayList<Any>.

So instead of this: listChild = HashMap<String, ArrayList<Any>>()

you should have: listChild = HashMap<String, ArrayList<TongQuan>>()


However, this will let you add only ArrayList<TongQuan>. If you want the ability to add ArrayList<TongQuan> or ArrayList<BangGia>, then you need to do the below:

listChild = HashMap<String, ArrayList<out Any>>()

For a detailed documentation on Variance, refer here: https://kotlinlang.org/docs/reference/generics.html

Sign up to request clarification or add additional context in comments.

Comments

0

Any is different with Object in Java. Unlike in java where every class is child of Object, in kotlin not every class is child of Any.

Instead of using ArrayList, you should use kotlin List. it should work like this:

ar arrayTQ = mutableListOf<TongQuan>()
var arrayBG = mutableListOf<BangGia>()
var epdbLV: ExpandableListView? = null
var listHeader: List<String> = listOf()
var listChild = HashMap<String, List<Any>>()

var arrayListData = mutableListOf<String>()
private fun addControl() {
    epdbLV = findViewById(R.id.epdbList)
    listHeader = ArrayList()
    listChild = HashMap<String, List<Any>>()
    listHeader = listOf("Tổng Quan Thị Quan Thị Trường, Bảng Giá, Lịch Sự Kiện, Tin Tức, Chỉ Số Thế Giới")
    arrayListData.clear()
    arrayTQ.clear()
    arrayBG.clear()
}

it should be safe to call

override fun onPostExecute(result: ArrayList<String>) {
        super.onPostExecute(result)
        getDataTQ()
        getDataBG()
        listChild.clear()
        listChild.put(listHeader.get(1), arrayTQ)
    }

as @Henry suggest, you should read kotlin Variance https://kotlinlang.org/docs/reference/generics.html

1 Comment

Thank you guys! Both worked correctly. I'm reading, learning that.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.