Error in Super keyword in ArrayAdapter in kotlin
up vote
-1
down vote
favorite
I was trying to send the word ArrayList in other ArrayDapter class, but the error arises that it has too many arguments and super keyword in kotlin can only be used on the left side of "." operator.
package com.example.android.miwok
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.LinearLayout
import android.widget.TextView
import android.widget.ArrayAdapter
import android.widget.ListView
class NumbersActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_numbers)
val words = ArrayList<Word>()
words.add(Word("one","lutti"))
words.add( Word("two", "otiiko"));
words.add( Word("three", "tolookosu"));
words.add( Word("four", "oyyisa"));
words.add( Word("five", "massokka"));
words.add( Word("six", "temmokka"));
words.add( Word("seven", "kenekaku"));
words.add( Word("eight", "kawinta"));
words.add( Word("nine", "wo’e"));
words.add( Word("ten", "na’aacha"));
val adapter = WordAdapter(this,words)
val listView = findViewById(R.id.list) as ListView?
listView!!.setAdapter(adapter)
}
}
The WordAdapter.kt file:-
package com.example.android.miwok
import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
import android.app.Activity
import android.content.Context
import android.widget.TextView
import android.view.LayoutInflater
class WordAdapter : ArrayAdapter<Word>() {
fun WordAdapter(context: Activity, words: ArrayList<Word>){
super.ArrayAdapter<Word>(context, 0, words)
}
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
// Check if the existing view is being reused, otherwise inflate the view
var listItemView = convertView
if (listItemView == null) {
listItemView = LayoutInflater.from(context).inflate(
R.layout.list_item, parent, false)
}
val currentWord = getItem(position)
val nameTextView = listItemView!!.findViewById(R.id.miwok_text_view) as TextView
nameTextView.setText(currentWord!!.getDefaultTranslation())
val numberTextView = listItemView.findViewById(R.id.default_text_view) as TextView
numberTextView.setText(currentWord!!.getMiwokTranslation())
return listItemView
}
}
I am not able to find the error in this.
The word super should be linked to which part is also confusable to me.
android inheritance kotlin super
|
show 4 more comments
up vote
-1
down vote
favorite
I was trying to send the word ArrayList in other ArrayDapter class, but the error arises that it has too many arguments and super keyword in kotlin can only be used on the left side of "." operator.
package com.example.android.miwok
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.LinearLayout
import android.widget.TextView
import android.widget.ArrayAdapter
import android.widget.ListView
class NumbersActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_numbers)
val words = ArrayList<Word>()
words.add(Word("one","lutti"))
words.add( Word("two", "otiiko"));
words.add( Word("three", "tolookosu"));
words.add( Word("four", "oyyisa"));
words.add( Word("five", "massokka"));
words.add( Word("six", "temmokka"));
words.add( Word("seven", "kenekaku"));
words.add( Word("eight", "kawinta"));
words.add( Word("nine", "wo’e"));
words.add( Word("ten", "na’aacha"));
val adapter = WordAdapter(this,words)
val listView = findViewById(R.id.list) as ListView?
listView!!.setAdapter(adapter)
}
}
The WordAdapter.kt file:-
package com.example.android.miwok
import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
import android.app.Activity
import android.content.Context
import android.widget.TextView
import android.view.LayoutInflater
class WordAdapter : ArrayAdapter<Word>() {
fun WordAdapter(context: Activity, words: ArrayList<Word>){
super.ArrayAdapter<Word>(context, 0, words)
}
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
// Check if the existing view is being reused, otherwise inflate the view
var listItemView = convertView
if (listItemView == null) {
listItemView = LayoutInflater.from(context).inflate(
R.layout.list_item, parent, false)
}
val currentWord = getItem(position)
val nameTextView = listItemView!!.findViewById(R.id.miwok_text_view) as TextView
nameTextView.setText(currentWord!!.getDefaultTranslation())
val numberTextView = listItemView.findViewById(R.id.default_text_view) as TextView
numberTextView.setText(currentWord!!.getMiwokTranslation())
return listItemView
}
}
I am not able to find the error in this.
The word super should be linked to which part is also confusable to me.
android inheritance kotlin super
1
Why are you callingsuper.ArrayAdapter
? Just useArrayAdapter
directly
– Zoe
yesterday
@Zoe, he wants to show more than one view per row.
– Andre Artus
yesterday
@AndreArtus so? Just initializing asArrayAdapter
is more than enough
– Zoe
yesterday
@Zoe, would you mind putting up an example? By default ArrayAdapter only loads one TextView (in a ViewGroup).
– Andre Artus
yesterday
The point beingsuper.ArrayAdapter<...>....
can be replaced withArrayAdapter<...>...
. As in removing thesuper.
part. That's all there is to it
– Zoe
yesterday
|
show 4 more comments
up vote
-1
down vote
favorite
up vote
-1
down vote
favorite
I was trying to send the word ArrayList in other ArrayDapter class, but the error arises that it has too many arguments and super keyword in kotlin can only be used on the left side of "." operator.
package com.example.android.miwok
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.LinearLayout
import android.widget.TextView
import android.widget.ArrayAdapter
import android.widget.ListView
class NumbersActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_numbers)
val words = ArrayList<Word>()
words.add(Word("one","lutti"))
words.add( Word("two", "otiiko"));
words.add( Word("three", "tolookosu"));
words.add( Word("four", "oyyisa"));
words.add( Word("five", "massokka"));
words.add( Word("six", "temmokka"));
words.add( Word("seven", "kenekaku"));
words.add( Word("eight", "kawinta"));
words.add( Word("nine", "wo’e"));
words.add( Word("ten", "na’aacha"));
val adapter = WordAdapter(this,words)
val listView = findViewById(R.id.list) as ListView?
listView!!.setAdapter(adapter)
}
}
The WordAdapter.kt file:-
package com.example.android.miwok
import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
import android.app.Activity
import android.content.Context
import android.widget.TextView
import android.view.LayoutInflater
class WordAdapter : ArrayAdapter<Word>() {
fun WordAdapter(context: Activity, words: ArrayList<Word>){
super.ArrayAdapter<Word>(context, 0, words)
}
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
// Check if the existing view is being reused, otherwise inflate the view
var listItemView = convertView
if (listItemView == null) {
listItemView = LayoutInflater.from(context).inflate(
R.layout.list_item, parent, false)
}
val currentWord = getItem(position)
val nameTextView = listItemView!!.findViewById(R.id.miwok_text_view) as TextView
nameTextView.setText(currentWord!!.getDefaultTranslation())
val numberTextView = listItemView.findViewById(R.id.default_text_view) as TextView
numberTextView.setText(currentWord!!.getMiwokTranslation())
return listItemView
}
}
I am not able to find the error in this.
The word super should be linked to which part is also confusable to me.
android inheritance kotlin super
I was trying to send the word ArrayList in other ArrayDapter class, but the error arises that it has too many arguments and super keyword in kotlin can only be used on the left side of "." operator.
package com.example.android.miwok
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.LinearLayout
import android.widget.TextView
import android.widget.ArrayAdapter
import android.widget.ListView
class NumbersActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_numbers)
val words = ArrayList<Word>()
words.add(Word("one","lutti"))
words.add( Word("two", "otiiko"));
words.add( Word("three", "tolookosu"));
words.add( Word("four", "oyyisa"));
words.add( Word("five", "massokka"));
words.add( Word("six", "temmokka"));
words.add( Word("seven", "kenekaku"));
words.add( Word("eight", "kawinta"));
words.add( Word("nine", "wo’e"));
words.add( Word("ten", "na’aacha"));
val adapter = WordAdapter(this,words)
val listView = findViewById(R.id.list) as ListView?
listView!!.setAdapter(adapter)
}
}
The WordAdapter.kt file:-
package com.example.android.miwok
import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
import android.app.Activity
import android.content.Context
import android.widget.TextView
import android.view.LayoutInflater
class WordAdapter : ArrayAdapter<Word>() {
fun WordAdapter(context: Activity, words: ArrayList<Word>){
super.ArrayAdapter<Word>(context, 0, words)
}
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
// Check if the existing view is being reused, otherwise inflate the view
var listItemView = convertView
if (listItemView == null) {
listItemView = LayoutInflater.from(context).inflate(
R.layout.list_item, parent, false)
}
val currentWord = getItem(position)
val nameTextView = listItemView!!.findViewById(R.id.miwok_text_view) as TextView
nameTextView.setText(currentWord!!.getDefaultTranslation())
val numberTextView = listItemView.findViewById(R.id.default_text_view) as TextView
numberTextView.setText(currentWord!!.getMiwokTranslation())
return listItemView
}
}
I am not able to find the error in this.
The word super should be linked to which part is also confusable to me.
android inheritance kotlin super
android inheritance kotlin super
edited yesterday
Zoe
10.1k73475
10.1k73475
asked yesterday
Priyanshu Vaya
42
42
1
Why are you callingsuper.ArrayAdapter
? Just useArrayAdapter
directly
– Zoe
yesterday
@Zoe, he wants to show more than one view per row.
– Andre Artus
yesterday
@AndreArtus so? Just initializing asArrayAdapter
is more than enough
– Zoe
yesterday
@Zoe, would you mind putting up an example? By default ArrayAdapter only loads one TextView (in a ViewGroup).
– Andre Artus
yesterday
The point beingsuper.ArrayAdapter<...>....
can be replaced withArrayAdapter<...>...
. As in removing thesuper.
part. That's all there is to it
– Zoe
yesterday
|
show 4 more comments
1
Why are you callingsuper.ArrayAdapter
? Just useArrayAdapter
directly
– Zoe
yesterday
@Zoe, he wants to show more than one view per row.
– Andre Artus
yesterday
@AndreArtus so? Just initializing asArrayAdapter
is more than enough
– Zoe
yesterday
@Zoe, would you mind putting up an example? By default ArrayAdapter only loads one TextView (in a ViewGroup).
– Andre Artus
yesterday
The point beingsuper.ArrayAdapter<...>....
can be replaced withArrayAdapter<...>...
. As in removing thesuper.
part. That's all there is to it
– Zoe
yesterday
1
1
Why are you calling
super.ArrayAdapter
? Just use ArrayAdapter
directly– Zoe
yesterday
Why are you calling
super.ArrayAdapter
? Just use ArrayAdapter
directly– Zoe
yesterday
@Zoe, he wants to show more than one view per row.
– Andre Artus
yesterday
@Zoe, he wants to show more than one view per row.
– Andre Artus
yesterday
@AndreArtus so? Just initializing as
ArrayAdapter
is more than enough– Zoe
yesterday
@AndreArtus so? Just initializing as
ArrayAdapter
is more than enough– Zoe
yesterday
@Zoe, would you mind putting up an example? By default ArrayAdapter only loads one TextView (in a ViewGroup).
– Andre Artus
yesterday
@Zoe, would you mind putting up an example? By default ArrayAdapter only loads one TextView (in a ViewGroup).
– Andre Artus
yesterday
The point being
super.ArrayAdapter<...>....
can be replaced with ArrayAdapter<...>...
. As in removing the super.
part. That's all there is to it– Zoe
yesterday
The point being
super.ArrayAdapter<...>....
can be replaced with ArrayAdapter<...>...
. As in removing the super.
part. That's all there is to it– Zoe
yesterday
|
show 4 more comments
1 Answer
1
active
oldest
votes
up vote
0
down vote
There are a few things you can improve upon:
You are currently writing Javlin, or Kotva, i.e. a mix of Java and Kotlin.
You should not be inflating the layout for every getView, and you should ideally be using the ViewHolder pattern (now shown below).
But the reason for your question, the compiler error calling super
. You are defining your constructor as a function, not a constructor.
In Java constructors are defined by writing methods with the same name as the class. In Kotlin you just pass the constructor parameters in the class definition. e.g.
class WordAdapter(context: Context, objects: List<Word>)
and pass those parameters through to the extended class as such:
class WordAdapter(context: Context, objects: List<Word>) :
ArrayAdapter<Word>(context, R.layout.list_item, R.id.default_text_view, objects)
an alternative approach, usually reserved for secondary constructors:
class WordAdapter : ArrayAdapter<Word> {
constructor(context: Context, objects: List<Word>) : super(
context, R.layout.list_item, R.id.default_text_view, objects
)
}
Here is a somewhat Kotlinified version of your code (I saw that you were swapping default and miwok in your getView, I assumed that was a mistake and did not copy that). I've also put a copy up on Github.
class MainActivity : AppCompatActivity() {
private val words = arrayListOf(
Word("one", "lutti"),
Word("two", "otiiko"),
Word("three", "tolookosu"),
Word("four", "oyyisa"),
Word("five", "massokka"),
Word("six", "temmokka"),
Word("seven", "kenekaku"),
Word("eight", "kawinta"),
Word("nine", "wo’e"),
Word("ten", "na’aacha")
)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val listView = findViewById<ListView>(R.id.list)
val adapter = WordAdapter(this, words)
listView.adapter = adapter
}
}
data class Word(val defaultTranslation: String, val miwokTranslation: String)
class WordAdapter(context: Context, objects: List<Word>) :
ArrayAdapter<Word>(context, R.layout.list_item, R.id.default_text_view, objects) {
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
val listItemView = super.getView(position, convertView, parent)
val defaultTextView = listItemView.findViewById<TextView>(R.id.default_text_view)
val miwokTextView = listItemView.findViewById<TextView>(R.id.miwok_text_view)
getItem(position)?.run {
defaultTextView.text = defaultTranslation
miwokTextView.text = miwokTranslation
}
return listItemView
}
}
Here is an example adapter using (a version of) the ViewHolder pattern (if you put a logging breakpoint on any of the row.findViewById
s you will see they are only called for as many items as are being displayed, not for every item in the list):
class WordAdapter(context: Context, objects: List<Word>) :
ArrayAdapter<Word>(context, R.layout.list_item, R.id.default_text_view, objects) {
class ViewHolder(row: View) {
init {
row.tag = this
}
val defaultTextView = row.findViewById<TextView>(R.id.default_text_view)!!
val miwokTextView = row.findViewById<TextView>(R.id.miwok_text_view)!!
}
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
val listItemView = super.getView(position, convertView, parent)
val holder = listItemView.tag as? ViewHolder ?: ViewHolder(listItemView)
getItem(position)?.run {
holder.defaultTextView.text = defaultTranslation
holder.miwokTextView.text = miwokTranslation
}
return listItemView
}
}
If you want to go overboard [:)] with Kotlin idioms:
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View =
super.getView(position, convertView, parent).also { row ->
(row.tag as? ViewHolder ?: ViewHolder(row)).apply {
getItem(position)?.run {
defaultTextView.text = defaultTranslation
miwokTextView.text = miwokTranslation
}
}
}
add a comment |
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
0
down vote
There are a few things you can improve upon:
You are currently writing Javlin, or Kotva, i.e. a mix of Java and Kotlin.
You should not be inflating the layout for every getView, and you should ideally be using the ViewHolder pattern (now shown below).
But the reason for your question, the compiler error calling super
. You are defining your constructor as a function, not a constructor.
In Java constructors are defined by writing methods with the same name as the class. In Kotlin you just pass the constructor parameters in the class definition. e.g.
class WordAdapter(context: Context, objects: List<Word>)
and pass those parameters through to the extended class as such:
class WordAdapter(context: Context, objects: List<Word>) :
ArrayAdapter<Word>(context, R.layout.list_item, R.id.default_text_view, objects)
an alternative approach, usually reserved for secondary constructors:
class WordAdapter : ArrayAdapter<Word> {
constructor(context: Context, objects: List<Word>) : super(
context, R.layout.list_item, R.id.default_text_view, objects
)
}
Here is a somewhat Kotlinified version of your code (I saw that you were swapping default and miwok in your getView, I assumed that was a mistake and did not copy that). I've also put a copy up on Github.
class MainActivity : AppCompatActivity() {
private val words = arrayListOf(
Word("one", "lutti"),
Word("two", "otiiko"),
Word("three", "tolookosu"),
Word("four", "oyyisa"),
Word("five", "massokka"),
Word("six", "temmokka"),
Word("seven", "kenekaku"),
Word("eight", "kawinta"),
Word("nine", "wo’e"),
Word("ten", "na’aacha")
)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val listView = findViewById<ListView>(R.id.list)
val adapter = WordAdapter(this, words)
listView.adapter = adapter
}
}
data class Word(val defaultTranslation: String, val miwokTranslation: String)
class WordAdapter(context: Context, objects: List<Word>) :
ArrayAdapter<Word>(context, R.layout.list_item, R.id.default_text_view, objects) {
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
val listItemView = super.getView(position, convertView, parent)
val defaultTextView = listItemView.findViewById<TextView>(R.id.default_text_view)
val miwokTextView = listItemView.findViewById<TextView>(R.id.miwok_text_view)
getItem(position)?.run {
defaultTextView.text = defaultTranslation
miwokTextView.text = miwokTranslation
}
return listItemView
}
}
Here is an example adapter using (a version of) the ViewHolder pattern (if you put a logging breakpoint on any of the row.findViewById
s you will see they are only called for as many items as are being displayed, not for every item in the list):
class WordAdapter(context: Context, objects: List<Word>) :
ArrayAdapter<Word>(context, R.layout.list_item, R.id.default_text_view, objects) {
class ViewHolder(row: View) {
init {
row.tag = this
}
val defaultTextView = row.findViewById<TextView>(R.id.default_text_view)!!
val miwokTextView = row.findViewById<TextView>(R.id.miwok_text_view)!!
}
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
val listItemView = super.getView(position, convertView, parent)
val holder = listItemView.tag as? ViewHolder ?: ViewHolder(listItemView)
getItem(position)?.run {
holder.defaultTextView.text = defaultTranslation
holder.miwokTextView.text = miwokTranslation
}
return listItemView
}
}
If you want to go overboard [:)] with Kotlin idioms:
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View =
super.getView(position, convertView, parent).also { row ->
(row.tag as? ViewHolder ?: ViewHolder(row)).apply {
getItem(position)?.run {
defaultTextView.text = defaultTranslation
miwokTextView.text = miwokTranslation
}
}
}
add a comment |
up vote
0
down vote
There are a few things you can improve upon:
You are currently writing Javlin, or Kotva, i.e. a mix of Java and Kotlin.
You should not be inflating the layout for every getView, and you should ideally be using the ViewHolder pattern (now shown below).
But the reason for your question, the compiler error calling super
. You are defining your constructor as a function, not a constructor.
In Java constructors are defined by writing methods with the same name as the class. In Kotlin you just pass the constructor parameters in the class definition. e.g.
class WordAdapter(context: Context, objects: List<Word>)
and pass those parameters through to the extended class as such:
class WordAdapter(context: Context, objects: List<Word>) :
ArrayAdapter<Word>(context, R.layout.list_item, R.id.default_text_view, objects)
an alternative approach, usually reserved for secondary constructors:
class WordAdapter : ArrayAdapter<Word> {
constructor(context: Context, objects: List<Word>) : super(
context, R.layout.list_item, R.id.default_text_view, objects
)
}
Here is a somewhat Kotlinified version of your code (I saw that you were swapping default and miwok in your getView, I assumed that was a mistake and did not copy that). I've also put a copy up on Github.
class MainActivity : AppCompatActivity() {
private val words = arrayListOf(
Word("one", "lutti"),
Word("two", "otiiko"),
Word("three", "tolookosu"),
Word("four", "oyyisa"),
Word("five", "massokka"),
Word("six", "temmokka"),
Word("seven", "kenekaku"),
Word("eight", "kawinta"),
Word("nine", "wo’e"),
Word("ten", "na’aacha")
)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val listView = findViewById<ListView>(R.id.list)
val adapter = WordAdapter(this, words)
listView.adapter = adapter
}
}
data class Word(val defaultTranslation: String, val miwokTranslation: String)
class WordAdapter(context: Context, objects: List<Word>) :
ArrayAdapter<Word>(context, R.layout.list_item, R.id.default_text_view, objects) {
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
val listItemView = super.getView(position, convertView, parent)
val defaultTextView = listItemView.findViewById<TextView>(R.id.default_text_view)
val miwokTextView = listItemView.findViewById<TextView>(R.id.miwok_text_view)
getItem(position)?.run {
defaultTextView.text = defaultTranslation
miwokTextView.text = miwokTranslation
}
return listItemView
}
}
Here is an example adapter using (a version of) the ViewHolder pattern (if you put a logging breakpoint on any of the row.findViewById
s you will see they are only called for as many items as are being displayed, not for every item in the list):
class WordAdapter(context: Context, objects: List<Word>) :
ArrayAdapter<Word>(context, R.layout.list_item, R.id.default_text_view, objects) {
class ViewHolder(row: View) {
init {
row.tag = this
}
val defaultTextView = row.findViewById<TextView>(R.id.default_text_view)!!
val miwokTextView = row.findViewById<TextView>(R.id.miwok_text_view)!!
}
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
val listItemView = super.getView(position, convertView, parent)
val holder = listItemView.tag as? ViewHolder ?: ViewHolder(listItemView)
getItem(position)?.run {
holder.defaultTextView.text = defaultTranslation
holder.miwokTextView.text = miwokTranslation
}
return listItemView
}
}
If you want to go overboard [:)] with Kotlin idioms:
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View =
super.getView(position, convertView, parent).also { row ->
(row.tag as? ViewHolder ?: ViewHolder(row)).apply {
getItem(position)?.run {
defaultTextView.text = defaultTranslation
miwokTextView.text = miwokTranslation
}
}
}
add a comment |
up vote
0
down vote
up vote
0
down vote
There are a few things you can improve upon:
You are currently writing Javlin, or Kotva, i.e. a mix of Java and Kotlin.
You should not be inflating the layout for every getView, and you should ideally be using the ViewHolder pattern (now shown below).
But the reason for your question, the compiler error calling super
. You are defining your constructor as a function, not a constructor.
In Java constructors are defined by writing methods with the same name as the class. In Kotlin you just pass the constructor parameters in the class definition. e.g.
class WordAdapter(context: Context, objects: List<Word>)
and pass those parameters through to the extended class as such:
class WordAdapter(context: Context, objects: List<Word>) :
ArrayAdapter<Word>(context, R.layout.list_item, R.id.default_text_view, objects)
an alternative approach, usually reserved for secondary constructors:
class WordAdapter : ArrayAdapter<Word> {
constructor(context: Context, objects: List<Word>) : super(
context, R.layout.list_item, R.id.default_text_view, objects
)
}
Here is a somewhat Kotlinified version of your code (I saw that you were swapping default and miwok in your getView, I assumed that was a mistake and did not copy that). I've also put a copy up on Github.
class MainActivity : AppCompatActivity() {
private val words = arrayListOf(
Word("one", "lutti"),
Word("two", "otiiko"),
Word("three", "tolookosu"),
Word("four", "oyyisa"),
Word("five", "massokka"),
Word("six", "temmokka"),
Word("seven", "kenekaku"),
Word("eight", "kawinta"),
Word("nine", "wo’e"),
Word("ten", "na’aacha")
)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val listView = findViewById<ListView>(R.id.list)
val adapter = WordAdapter(this, words)
listView.adapter = adapter
}
}
data class Word(val defaultTranslation: String, val miwokTranslation: String)
class WordAdapter(context: Context, objects: List<Word>) :
ArrayAdapter<Word>(context, R.layout.list_item, R.id.default_text_view, objects) {
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
val listItemView = super.getView(position, convertView, parent)
val defaultTextView = listItemView.findViewById<TextView>(R.id.default_text_view)
val miwokTextView = listItemView.findViewById<TextView>(R.id.miwok_text_view)
getItem(position)?.run {
defaultTextView.text = defaultTranslation
miwokTextView.text = miwokTranslation
}
return listItemView
}
}
Here is an example adapter using (a version of) the ViewHolder pattern (if you put a logging breakpoint on any of the row.findViewById
s you will see they are only called for as many items as are being displayed, not for every item in the list):
class WordAdapter(context: Context, objects: List<Word>) :
ArrayAdapter<Word>(context, R.layout.list_item, R.id.default_text_view, objects) {
class ViewHolder(row: View) {
init {
row.tag = this
}
val defaultTextView = row.findViewById<TextView>(R.id.default_text_view)!!
val miwokTextView = row.findViewById<TextView>(R.id.miwok_text_view)!!
}
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
val listItemView = super.getView(position, convertView, parent)
val holder = listItemView.tag as? ViewHolder ?: ViewHolder(listItemView)
getItem(position)?.run {
holder.defaultTextView.text = defaultTranslation
holder.miwokTextView.text = miwokTranslation
}
return listItemView
}
}
If you want to go overboard [:)] with Kotlin idioms:
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View =
super.getView(position, convertView, parent).also { row ->
(row.tag as? ViewHolder ?: ViewHolder(row)).apply {
getItem(position)?.run {
defaultTextView.text = defaultTranslation
miwokTextView.text = miwokTranslation
}
}
}
There are a few things you can improve upon:
You are currently writing Javlin, or Kotva, i.e. a mix of Java and Kotlin.
You should not be inflating the layout for every getView, and you should ideally be using the ViewHolder pattern (now shown below).
But the reason for your question, the compiler error calling super
. You are defining your constructor as a function, not a constructor.
In Java constructors are defined by writing methods with the same name as the class. In Kotlin you just pass the constructor parameters in the class definition. e.g.
class WordAdapter(context: Context, objects: List<Word>)
and pass those parameters through to the extended class as such:
class WordAdapter(context: Context, objects: List<Word>) :
ArrayAdapter<Word>(context, R.layout.list_item, R.id.default_text_view, objects)
an alternative approach, usually reserved for secondary constructors:
class WordAdapter : ArrayAdapter<Word> {
constructor(context: Context, objects: List<Word>) : super(
context, R.layout.list_item, R.id.default_text_view, objects
)
}
Here is a somewhat Kotlinified version of your code (I saw that you were swapping default and miwok in your getView, I assumed that was a mistake and did not copy that). I've also put a copy up on Github.
class MainActivity : AppCompatActivity() {
private val words = arrayListOf(
Word("one", "lutti"),
Word("two", "otiiko"),
Word("three", "tolookosu"),
Word("four", "oyyisa"),
Word("five", "massokka"),
Word("six", "temmokka"),
Word("seven", "kenekaku"),
Word("eight", "kawinta"),
Word("nine", "wo’e"),
Word("ten", "na’aacha")
)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val listView = findViewById<ListView>(R.id.list)
val adapter = WordAdapter(this, words)
listView.adapter = adapter
}
}
data class Word(val defaultTranslation: String, val miwokTranslation: String)
class WordAdapter(context: Context, objects: List<Word>) :
ArrayAdapter<Word>(context, R.layout.list_item, R.id.default_text_view, objects) {
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
val listItemView = super.getView(position, convertView, parent)
val defaultTextView = listItemView.findViewById<TextView>(R.id.default_text_view)
val miwokTextView = listItemView.findViewById<TextView>(R.id.miwok_text_view)
getItem(position)?.run {
defaultTextView.text = defaultTranslation
miwokTextView.text = miwokTranslation
}
return listItemView
}
}
Here is an example adapter using (a version of) the ViewHolder pattern (if you put a logging breakpoint on any of the row.findViewById
s you will see they are only called for as many items as are being displayed, not for every item in the list):
class WordAdapter(context: Context, objects: List<Word>) :
ArrayAdapter<Word>(context, R.layout.list_item, R.id.default_text_view, objects) {
class ViewHolder(row: View) {
init {
row.tag = this
}
val defaultTextView = row.findViewById<TextView>(R.id.default_text_view)!!
val miwokTextView = row.findViewById<TextView>(R.id.miwok_text_view)!!
}
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
val listItemView = super.getView(position, convertView, parent)
val holder = listItemView.tag as? ViewHolder ?: ViewHolder(listItemView)
getItem(position)?.run {
holder.defaultTextView.text = defaultTranslation
holder.miwokTextView.text = miwokTranslation
}
return listItemView
}
}
If you want to go overboard [:)] with Kotlin idioms:
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View =
super.getView(position, convertView, parent).also { row ->
(row.tag as? ViewHolder ?: ViewHolder(row)).apply {
getItem(position)?.run {
defaultTextView.text = defaultTranslation
miwokTextView.text = miwokTranslation
}
}
}
edited yesterday
answered yesterday
Andre Artus
1,4381118
1,4381118
add a comment |
add a comment |
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53238407%2ferror-in-super-keyword-in-arrayadapter-in-kotlin%23new-answer', 'question_page');
}
);
Post as a guest
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
1
Why are you calling
super.ArrayAdapter
? Just useArrayAdapter
directly– Zoe
yesterday
@Zoe, he wants to show more than one view per row.
– Andre Artus
yesterday
@AndreArtus so? Just initializing as
ArrayAdapter
is more than enough– Zoe
yesterday
@Zoe, would you mind putting up an example? By default ArrayAdapter only loads one TextView (in a ViewGroup).
– Andre Artus
yesterday
The point being
super.ArrayAdapter<...>....
can be replaced withArrayAdapter<...>...
. As in removing thesuper.
part. That's all there is to it– Zoe
yesterday