【问题标题】:Capitalize each word in Kotlin Arraylist将 Kotlin Arraylist 中的每个单词大写
【发布时间】:2019-07-23 10:41:00
【问题描述】:

我知道用字符串大写数组列表,因为数据可以用

list.map({ it.capitalize()})作为列表返回。

现在,如果它是一个数据类而不是字符串呢?

class MainActivity : AppCompatActivity() {
    val animals: ArrayList<Animals> = ArrayList()
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        addAnimals()
        recyclerView.layoutManager = LinearLayoutManager(this)
        recyclerView.addItemDecoration(DividerItemDecoration(this,DividerItemDecoration.VERTICAL))
        recyclerView.adapter = AnimalAdapter(this, animals)

    }
      data class Animals(val name: String, val type: String)

    fun addAnimals() {
        animals.add(Animals("dog","bark"))
        animals.add(Animals("cat","meow"))
        animals.add(Animals("owl","hoot"))
        animals.add(Animals("cheetah","roar, growl, snarl"))
        animals.add(Animals("raccoon","trill"))
        animals.add(Animals("bird","chirp"))
        animals.add(Animals("snake","hiss"))
        animals.add(Animals("lizard","?"))
        animals.add(Animals("hamster","squeak"))
        animals.add(Animals("bear","roar, growl"))
        animals.add(Animals("lion","roar, growl, snarl"))
        animals.add(Animals("tiger","roar, growl, snarl"))
        animals.add(Animals("horse","neigh"))
        animals.add(Animals("frog","croak"))
        animals.add(Animals("fish","?"))
        animals.add(Animals("shark","?"))
        animals.add(Animals("turtle","?"))
        animals.add(Animals("elephant","trumpet"))
        animals.add(Animals("cow","moo"))
        animals.add(Animals("beaver","?"))
        animals.add(Animals("bison","moo"))
        animals.add(Animals("porcupine","?"))
        animals.add(Animals("rat","woof"))
        animals.add(Animals("mouse","squeak"))
        animals.add(Animals("goose","honk, hiss"))
        animals.add(Animals("deer","bellow"))
        animals.add(Animals("fox","bark, howl, growl, bay"))
        animals.add(Animals("moose","bellow"))
        animals.add(Animals("buffalo","moo"))
        animals.add(Animals("monkey","scream, chatter"))
        animals.add(Animals("penguin","?"))
        animals.add(Animals("parrot","squawk"))
    }

AnimalAdapter:

private class AnimalAdapter(val context: Context, val items: ArrayList<Animals>) : RecyclerView.Adapter<ViewHolder>() {
        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
            return ViewHolder(LayoutInflater.from(context).inflate(R.layout.animal_item, parent, false))
        }

        override fun getItemCount(): Int {
            return items.size
        }

        override fun onBindViewHolder(holder: ViewHolder, position: Int) {
            holder.tvAnimalType?.text = items.get(position).name.capitalize()
            holder.tvAnimalSounds?.text = items.get(position).type.capitalize()
            holder.itemView.setOnClickListener {
                val alertDialog: AlertDialog.Builder = AlertDialog.Builder(context)
                alertDialog.setMessage("Success")
                    .setPositiveButton("Ok") { dialog, which -> dialog.dismiss()
                    }
                    .setNegativeButton("Cancel") { dialog, which -> dialog.dismiss()
                    }
                val alert = alertDialog.create()
                // set title for alert dialog box
                alert.setTitle("AlertDialogExample")
                // show alert dialog
                alert.show()
            }
        }
    }

    private class ViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        // Holds the TextView that will add each animal to
        val tvAnimalType = view.animal_type
        val tvAnimalSounds = view.animal_sounds
    }

P.S:我知道我可以在适配器类中大写它,而 设置它,我已经完成了。但是如果我必须这样做怎么办 在将列表传递给适配器之前?

【问题讨论】:

    标签: android arraylist kotlin


    【解决方案1】:

    第一个选项是在创建 animal 对象时添加大写名称。如果那不可能,那么您可以像这样传递动物列表

    recyclerView.adapter = AnimalAdapter(this, animals.map({Animals(it.name.capitalize(),it.type)}));
    

    【讨论】:

    • 好吧,你只返回名称到适配器类。它不应该是由名称和类型组成的动物数据吗?在创建动物对象时创建大写名称似乎也很有趣。
    • 完美!刚刚开始我的 Kotlin 之旅.. 谢谢 :)
    【解决方案2】:

    根据您的需求,您可以使用已经大写的值创建一个 Animal 对象:

    class Animal(name: String, type: String) {
        val name: String = name.capitalize()
        val type: String = type.capitalize()
    }
    

    请注意,在这种情况下,Animal 类不再是 data 类。

    或在使用之前绘制您的动物列表:

    val mappedAnimals = animals.map { Animal(it.name.capitalize(), it.type.capitalize()) }
    recyclerView.adapter = AnimalAdapter(this, mappedAnimals)
    

    【讨论】:

      【解决方案3】:

      我不会使用映射来大写所有字符串。 其实还有更好的办法。您可以在视图级别的 TextView 中将这些字符串大写。

      为什么我认为这比更改数据更好?

      您不修改数据。现在,您的映射模型与原始模型不同。这可能是错误的根源,因为Animal("Dog", "John") != Animal("DOG", "JOHN")。此外,当您更改 Animal 类时,您也有可能在某个地方也进行更改。

      在视图级别进行大写使其更易于阅读、查找和修改。

      而且很简单:

      <TextView>
          ...
          android:textAllCaps=true
      </TextView>
      

      @见: https://developer.android.com/reference/android/widget/TextView.html#attr_android:textAllCaps

      【讨论】:

      • 嘿 Cilling.. 很高兴听到你的想法。!好吧,正如我在 PS 部分中提到的那样,我知道如何做到这一点,并且已经在适配器类中实现了 .capitalize() 。并且文本全部大写在 kotlin/java 中有点等于 toUpperCase。我的问题真的是,我只是想知道我是否可以为数据类中的整个元素列表做到这一点..
      • 我们只需要将单词的第一个字母大写,而不是设置“textAllCaps=true”,这会使所有字符都大写。
      猜你喜欢
      • 2020-12-22
      • 2021-10-05
      • 2020-02-07
      • 2015-11-10
      • 1970-01-01
      • 2010-10-16
      • 2020-04-01
      • 1970-01-01
      相关资源
      最近更新 更多