【问题标题】:Android Kotlin: Convert from java (wrong arguments?)Android Kotlin:从 java 转换(错误的参数?)
【发布时间】: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 可以为空,则整个类将毫无用处。

标签: java android kotlin


【解决方案1】:

MyAdapater 类的代码应该是:

internal class MyAdapter constructor(
        val c: Context,
        val title: Array<String>,
        val description: Array<String>,
        val 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)
        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]

        return row
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 2017-10-30
    • 2018-02-01
    • 1970-01-01
    • 2020-05-23
    相关资源
    最近更新 更多