【发布时间】:2020-07-05 21:47:35
【问题描述】:
我想将 Java 代码转换为 Kotlin。但这不起作用。 ArrayAdapter 无法继承,因为引发错误:“以下函数均不能使用提供的参数调用。”奇怪的是,它也不识别 getApplicationContext(),虽然我不确定它是否是一个后果性错误。
Kotlin 试用版:
package com.example.evpic.ui.main
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
import android.widget.ImageView
import android.widget.ListView
import android.widget.TextView
import androidx.annotation.Nullable
import androidx.appcompat.app.AppCompatActivity
import androidx.viewpager.widget.ViewPager
import com.example.evpic.R
import com.google.android.material.floatingactionbutton.FloatingActionButton
import com.google.android.material.tabs.TabLayout
import java.io.*
import java.net.HttpURLConnection
import java.net.URL
class LoginSucessActivity : AppCompatActivity() {
var listView: ListView? = null
var sTitle =
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
)
val PICK_IMAGE = 1 //
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.w("xxxxxxxxxxx", "LoginSucessActivity");
setContentView(R.layout.activity_main)
listView = findViewById(R.id.listView)
}
internal class MyAdapater : ArrayAdapter<String>() constructor(c_: Context, title_: Array<String>, description_: Array<String>, imgs_: Array<Int>) : super(c_, R.layout.row, R.id.textView1, title_) {
var c: Context? = null
var rTitle: Array<String>? = null
var rDescription: Array<String>? = null
var rImgs: Array<Int>? = null
constructor {
c = c_
rTitle = title_
rDescription = description_
rImgs = imgs_
}
override fun getView(position: Int, @Nullable convertView: View?, parent: ViewGroup): View {
val layoutInflater: LayoutInflater = getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
val row: View = layoutInflater.inflate(R.layout.row, parent, false)
val images: ImageView = row.findViewById(R.id.image)
val myTitle = row.findViewById<TextView>(R.id.textView1)
val myDescription = row.findViewById<TextView>(R.id.textView2)
images.setImageResource(rImgs!![position])
myTitle.text = rTitle!![position]
myDescription.text = rDescription!![position]
return super.getView(position, convertView, parent)
}
}
}
原始 Java 代码:
class MyAdapater extends ArrayAdapter<String>{
Context context;
String sTitle[];
String rDescription[];
int rImgs[];
MyAdapter(Context c, String title[], String description[], int imgs[]){
super(c, R.layout.row, R.id.textView1, title);
this.context = c;
this.rTitle = title;
this.rDescription = description;
this.rImgs = imgs;
}
@NonNull
@OVerride
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent){
LayoutInflater layoutInflater = (LayoutInflator)getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View row = layoutInflater.inflate(R.layout.row, parent, false);
ImageView images = row.findViewById(R.id.image);
TextView myTitle = row.findViewById(R.id.textView1);
TextView myDescription = row.findViewById(R.id.textView2);
images.setImageResource(rImgs[position]);
myTitle.setText(rTitle[position]);
myDescription.setText(rDescription[position]);
return super.getView(position, convertView, parent);
}
}
【问题讨论】:
-
您是手动将其转换为 Kotlin 还是使用内置工具转换为 Kotlin?
-
getApplicationContext()在 Kotlin 中是applicationContext -
二级构造函数的意义何在?它无法调用任何超级构造函数,如果 Context 可以为空,则整个类将毫无用处。