Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否可以扩展具有非空构造函数和伴随对象的类_Java_Android_Kotlin_Static_Kotlin Companion - Fatal编程技术网

Java 是否可以扩展具有非空构造函数和伴随对象的类

Java 是否可以扩展具有非空构造函数和伴随对象的类,java,android,kotlin,static,kotlin-companion,Java,Android,Kotlin,Static,Kotlin Companion,我有一个Java代码,我想改成Kotlin语法。 jave代码是: public class CountryDataItem (String countryNane,String countryUrl) { public static RecyclerView.ViewHolder onCreateViewHolder (ViewGroup parent) { new ViewHolder (parent); } public static

我有一个Java代码,我想改成Kotlin语法。 jave代码是:

  public class CountryDataItem (String countryNane,String countryUrl)
{
    public static RecyclerView.ViewHolder onCreateViewHolder (ViewGroup parent)
    {
        new ViewHolder (parent);
    }

    public static class ViewHolder extends RecyclerView.ViewHolder
    {
        private TextView countryTextView;
        private ImageView countryImageView;
     
        public ViewHolder(@NonNull View view)
        {
            super(view);
            view.findViewById...
            ...
        }
    } 
}
代码与RecyclerView相关。我希望能够从静态嵌套类类型创建尽可能多的ViewHolder。 我写了下面的代码,但感觉我是一个糟糕的代码,不可读(我不喜欢写匿名类,但不知道如何写“静态”ViewHolder类,也总是返回相同的字段)

我写的代码:

   class CountryDataItem (val countryName :String, var countryFlagUrl )
{
    companion object
    {

         fun onCreateViewHolder(parent: ViewGroup): RecyclerView.ViewHolder {
             return object : RecyclerView.ViewHolder(parent) {
                 val countryNameTextView: TextView = parent.findViewById(R.id.country_name_tv)
                 val countryFlagUrl: ImageView = parent.findViewById(R.id.country_iv)
             }
         }
    }
我更喜欢使用一个附带对象编写代码,该对象扩展了RecyclerView.ViewHolder类,因为我编写了:

对象ViewHolder:RecyclewView.ViewHolder 强制我向RecyclewView.ViewHolder提供View类型的provide()和参数


我不能这样做

嵌套类在Kotlin中默认是静态的。您必须将它们标记为
内部
,使它们不是静态的。因此,您的Java类在Kotlin中可能是这样的:

class CountryDataItem (val countryName: String, var countryFlagUrl: String) {

    companion object {
        fun onCreateViewHolder(parent: ViewGroup) = ViewHolder(parent)
    }

    class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        val countryTextView: TextView = view.findViewById...
        val countryImageView: ImageView = view.findViewById...
    } 
}

您应该在ViewHolder类中拥有伴生对象。如下所示:

类CountryDataItem(countryName:String,countryUrl){
类ViewHolder私有构造函数(视图:视图):RecyclerView.ViewHolder(视图){
private val textView:textView=view.findViewById(R.id.textView)
private val imageView:imageView=view.findviewbyd(R.id.imageView)
趣味绑定(模型:模型){
textView.text=。。。
}
伴星{
乐趣来自(父:视图组):视图持有者{
val layoutInflater=layoutInflater.from(parent.context)
val view=LAYOUTINGFLATER.充气(R.layout.list_项,父项,false)
返回视图保持器(视图)
}
}
}
}
现在,要创建ViewHolder,只需从方法调用
。如下所示:

CountryDataItem.ViewHolder.from(父项)

使用
内部类
@Nikola Depososki这是我唯一的选择吗?正如您在java代码中看到的,我避免这样做的首选方法是将两个类分离到不同的文件中。单一用途。但我看到它们之间的关系,在java中实现它非常容易。就像我经常说的那样..Kotlin是最糟糕的语言我认为他们误解了你的要求。谢谢。但是:1.为什么构造函数是私有的?2.绑定函数不需要是CountryDataItem的一部分而不是ViewHolder类的一部分吗?1.很抱歉我修改了你的代码,但我相信
ViewHolder
类应该负责创建f视图,而不是从另一个类接收视图。2.不,我相信视图发生了什么(逻辑)应保留在
ViewHolder
类中,数据可能由外部实体设置。我的信念基于单一责任原则。这样,对ViewHolder的任何更改都不会对任何其他类产生影响。按照您设计代码的方式,布局的更改将意味着多个类的更改。我理解您为第1节给出的原因。但对于第2节,所有数据都是CountryDataItem的一部分(进入构造函数)因此,我不确定逻辑是否应该是ViewHolder的一部分。我必须说,我在RecyclerView实现中看到的所有示例,所有逻辑都不在ViewHolder类中。但我只编程了一年,所以我不能与专家争论上帝保佑你,伙计!!!我喜欢你解释事情的方式,而不仅仅是编写代码:)虽然你似乎错过了充气:)我在做上面你们班的一个直接端口,它没有显示充气。我想你可以在
onCreateViewHolder
中完成,如果你将一个上下文或LayoutFlater参数传递给函数。只是为了解决我的好奇。你能告诉我我的原始代码是否可以处理多个项吗?它将不可用,因为属性是在匿名类中声明的,所以它们不可检索。