【问题标题】:How to make a data class variable optional? (Android Studio - Kotlin)如何使数据类变量可选? (Android Studio - Kotlin)
【发布时间】:2020-04-26 17:52:08
【问题描述】:

当我点击回收视图中的一个项目(课程名称)时,它会将我带到一个新活动。但是,我现在只需要 2 门课程即可。对于recycleview 中的其余项目,我不想添加任何目标活动。取而代之的是,我只想添加一条 toast 消息,例如“此功能尚不可用”。我该如何做这些事情?

数据类:

data class CourseList(
    val courseTitle: String,
    val courseType: String,
    val courseLength: String,
    val target: Class<out Activity>
)

CourseListActivityHE:

CourseListActivityHe : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.course_list)

        val course = listOf(
            CourseList("BSc (Hons) Networking", "Type: Full/Part Time", "Length: 3/6 Years", CourseViewActivityHe1::class.java),
            CourseList("BSc (Hons) Software Engineering", "Type: Full/Part Time", "Length: 3/6 Years", CourseListActivityHe::class.java),
            CourseList("BSc (Hons) Civil Engineering PM", "Type: Full/Part Time", "Length: 3/6 Years", CourseListActivityHe::class.java),
            CourseList("Level 4 Electrical Engineering", "Type: Full/Part Time", "Length: 1/2 Years", CourseListActivityHe::class.java),
            CourseList("Level 4 Mechanical Engineering", "Type: Full/Part Time", "Length: 1/2 Years", CourseListActivityHe::class.java),
            CourseList("Level 5 Electrical Engineering", "Type: Full/Part Time", "Length: 2/4 Years", CourseListActivityHe::class.java),
            CourseList("Level 5 Mechanical Engineering", "Type: Full/Part Time", "Length: 2/4 Years", CourseListActivityHe::class.java),
            CourseList("BSc (Hons) Ophthalmic Dispensing", "Type: Full/Part Time", "Length: 3/6 Years", CourseListActivityHe::class.java),
            CourseList("FdSc Ophthalmic Dispensing", "Type: Full/Part Time", "Length: 2/4 Years", CourseListActivityHe::class.java)
        )

        list_of_course.apply {
            layoutManager = LinearLayoutManager(this@CourseListActivityHe)
            adapter = CourseListAdapter(course){
                startActivity(Intent(this@CourseListActivityHe, it.target))
            }
        }

CourseListAdapter(如果需要):

class CourseListAdapter( val course: List<CourseList>, val courseClicked: (CourseList) -> Unit):
RecyclerView.Adapter<CourseListAdapter.ViewHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val layoutView = LayoutInflater.from(parent.context).inflate(R.layout.course_list_activity, parent, false)
        return ViewHolder(layoutView)
    }

    override fun getItemCount() = course.size

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val cours = course[position]

        with(holder.view) {
            setOnClickListener{
                (courseClicked)(cours)
        }
    }

        holder.view.courseTitle.text = "${cours.courseTitle}"
        holder.view.courseType.text = "${cours.courseType}"
        holder.view.courseLength.text = "${cours.courseLength}"
    }

    class ViewHolder(val view: View) : RecyclerView.ViewHolder(view)

}

【问题讨论】:

    标签: android variables kotlin android-recyclerview android-toast


    【解决方案1】:

    您可以为构造函数参数提供默认值。

    data class CourseList(
            val courseTitle: String = "",
            val courseType: String = "",
            val courseLength: String,
            val target: Class<out Activity>
        )
    

    更好的例子:

    fun main(args: Array<String>) {
    
        println("person1 is instantiated")
        val person1 = Person("joe", 25)
    
        println("person2 is instantiated")
        val person2 = Person("Jack")
    
        println("person3 is instantiated")
        val person3 = Person()
    }
    
    class Person(_firstName: String = "UNKNOWN", _age: Int = 0) {
        val firstName = _firstName.capitalize()
        var age = _age
    
        // initializer block
        init {
            println("First Name = $firstName")
            println("Age = $age\n")
        }
    }
    

    编码愉快!!

    【讨论】:

      【解决方案2】:

      你可以这样做:

      data class CourseList(
          val courseTitle: String = "",
          val courseType: String = "Type: Full/Part Time",
          val courseLength: String = "",
          val target: Class<out Activity> = CourseListActivityHe::class.java
      )
      
      or
      
      so only 2 courseTitle and courseLength is required
      
      data class CourseList(
          val courseTitle: String,
          val courseType: String = "Type: Full/Part Time",
          val courseLength: String,
          val target: Class<out Activity> = CourseListActivityHe::class.java
      )
      

      这样所有的变量都是可选的

      【讨论】:

      • 感谢您的回复。你能告诉我如何设置 course1 和 course2 按钮来打开不同的活动吗?因为上面的代码会将相同的目标活动应用于回收视图中的每个项目(课程),但我希望他们打开不同的活动。提前致谢!
      • 我的意思是,我能够将每个项目定向到不同的活动,但是当我将目标变量留空时,它仍然会将我带到 CourseListActivityHE,它在 CourseList 中定义。
      • 只需提供 4 个参数,如果您想修改活动,它仍然会被接受
      • 我试过了,但我无法解决这个问题。当我在 listOf 中将目标活动的空间留空时,没有任何错误。但是当我运行它时,没有目标的特定项目将带我进入数据类中提到的活动。 "val target: Class = CourseListActivityHe::class.java" 如何在不提及数据类中的任何活动名称的情况下也将目标设为可选?
      • 您可以将它们声明为:CourseList(courseTitle="BSc (Hons) Networking",courseType="Length: 3/6 Years", target=CourseViewActivityHe1::class.java)
      猜你喜欢
      • 2018-04-18
      • 1970-01-01
      • 1970-01-01
      • 2017-02-25
      • 1970-01-01
      • 2017-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多