【问题标题】:Kotlin ListView item click based on StringKotlin ListView 项目点击基于字符串
【发布时间】:2019-12-16 21:02:12
【问题描述】:

有没有办法检查在简单的ListView 中点击了哪个字符串?我希望ListView(单击时)中的每个项目都发生不同的事情,但我没有看到任何相关/有用的教程。我知道为此需要 when 块,但不确定实现它的最佳方式。

class MainActivity : AppCompatActivity() {

    var array = arrayOf("Melbourne", "Vienna", "Vancouver", "Toronto", "Calgary", "Adelaide", "Perth", "Auckland", "Helsinki", "Hamburg", "Munich", "New York", "Sydney", "Paris", "Cape Town", "Barcelona", "London", "Bangkok")

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

        val adapter = ArrayAdapter(this,
                R.layout.listview_item, array)

        val listView:ListView = findViewById(R.id.listview_1)
        listView.setAdapter(adapter)

        listView.onItemClickListener = object : OnItemClickListener {

            override fun onItemClick(parent: AdapterView<*>, view: View,
                            position: Int, id: Long) {
                    ????
            }
        }

    }
} 

listview_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    android:id="@+id/relativelayout_listitem"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="top"
    android:baselineAligned="false"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <TextView android:id="@+id/listitem_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:ellipsize="marquee"
        android:layout_below="@id/ll_title"
        android:fadingEdge="horizontal" />
</RelativeLayout>

【问题讨论】:

  • 发布您的 listview_item.xml

标签: android kotlin android-listview android-arrayadapter android-adapter


【解决方案1】:

onItemClick() 内部,position 参数是数据集中被点击的位置。所以你应该能够索引到你的数组以获取点击的字符串:

val tappedString = array[position] // will be "Vienna" when position is 1

如果你想验证被点击的item是否有某个值,你可以类似地这样做:

if (array[position] == "Vienna") {
    // ...
}

【讨论】:

  • 我不想使用位置编号。在这种情况下,字符串更容易,因为将来需要更改某些名称
  • 我不明白你的评论。你有一个字符串数组:var array = arrayOf("Melbourne", "Vienna", ...)。因此,array[0] 是“墨尔本”,array[1] 是“维也纳”。对数组的索引是数组的全部内容。你为什么不想这样做?
  • 数组变量读写有点可疑。也许长度也可以更改,如果数组更改但不会立即在适配器中更新,则会产生问题。
  • @MacaronLover 我认为这里存在根本性的误解。如果您更改array 的顺序,则发布的答案将起作用。
  • @MacaronLover 你是说你想做类似if (tapped == "Vienna") 的事情吗?然后你可以做if (array[position] == "Vienna")。你不必检查if (position == 1)
【解决方案2】:

如果您不想使用positionarray,那么您可以从视图中获取文本。

试试这个:

override fun onItemClick(parent: AdapterView<*>, view: View,
                        position: Int, id: Long) {
    val textClicked = view.findViewById<TextView>(R.id.listitem_title).text.toString()
    when (textClicked) {
        "something1" -> TODO()
        "something2" -> TODO()
    }
}

【讨论】:

  • 如何检查点击的项目是否是特定的String名称?
  • 现在有帮助吗?
猜你喜欢
  • 2011-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多