Java 是否可以扩展具有非空构造函数和伴随对象的类
我有一个Java代码,我想改成Kotlin语法。 jave代码是: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
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参数传递给函数。只是为了解决我的好奇。你能告诉我我的原始代码是否可以处理多个项吗?它将不可用,因为属性是在匿名类中声明的,所以它们不可检索。