【问题标题】:Creating Rows in ListView with ArrayAdapter in Kotlin在 Kotlin 中使用 ArrayAdapter 在 ListView 中创建行
【发布时间】:2021-12-28 22:02:23
【问题描述】:

我有一个应用程序从 API 请求中获取信息,然后显示设备列表。经过几个小时梳理文档后,我无法弄清楚如何格式化从ArrayAdapter 创建的视图。本质上,如果设备有错误,我想在按钮右侧显示一个红色圆圈,如果没有错误,则显示一个绿色按钮。

deviceList 是我试图在其中显示按钮列表的 ListView 的名称。 deviceNames 是一个包含设备名称的字符串数组。

创建的 TextViews 也是可点击的,这是 onItemClickListener 正在处理的。此部分有效,但我想保留它,因为我确实需要按钮来启动显示设备特定信息的活动。

理想情况下,我想创建一个模板,我可以只更改文本的值和指示器的颜色

下面是我的代码:

                    // List of device names
                    val listView: ListView = findViewById(R.id.deviceList)
                    val arrayAdapter1: ArrayAdapter<*>
                    arrayAdapter1 = ArrayAdapter(
                        this@Homepage,
                        R.layout.device_button,
                        deviceNames
                    )
                    listView.setAdapter(arrayAdapter1)

                    listView.onItemClickListener =
                        AdapterView.OnItemClickListener { parent, view, position, id ->
                            val pos = position
                            println(pos)
                            val device = jsonArray.getJSONObject(pos)
                            val ID = device.get("id") as String
                            println(ID)
                            goToDeviceDetail(ID)
                        }

以下是device_button 的 XML 文件。我尝试在此处添加格式,并实质上为按钮创建了一个模板,该模板允许我更改指示器的文本和颜色,但它不仅仅是一个 TextView,这让我很生气。

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="40dp"
    android:gravity="center_vertical"
    android:textColor="#25383C"
    />

下面是我希望它看起来像的按钮。我可能只会将背景设为纯色,而不是下图中的图像:

【问题讨论】:

    标签: android kotlin listview android-arrayadapter


    【解决方案1】:

    我想说最大的问题是您使用简单的 API 来解决更复杂的问题。使用ListView 和ArrayAdapter 完全可以做到这一点。但我强烈建议您查看RecyclerView/RecyclerView.Adapter

    结果是……

    RecyclerView.Adapter 将您的数据列表(即设备)绑定到个人RecyclerView.ViewHolder

    ViewHolder 会膨胀包含按钮的 xml 布局。然后,您可以轻松访问该布局中包含的所有View。 然后,您可以将侦听器放在按钮上。

    然后可以设置Adapter 接收新数据,收到后可以重新绑定已更改的数据。

    假设用户单击它执行任务的设备按钮之一。当它回来时它会说嘿Adapter我有一个新的列表给你。(列表现在包含“固定”设备)。

    ViewModel(包含可观察数据)->Fragment/Activity(观察数据)->Adapter(接收数据) em>->ViewHolder(显示数据)->Activity(“修复数据”)->ViewModel->...循环

    这是一个很好的例子。

    https://medium.com/@atifmukhtar/recycler-view-with-mvvm-livedata-a1fd062d2280

    如果您真的想继续使用ListView 和ArrayAdapter,您将在此处收到点击视图。

        OnItemClickListener {
              /*Parent of the view*/ parent,
              /*The view clicked*/ view, 
              /*position of data*/position,
              /*id of the view clicked*/ id 
           ->{
                 view.findById(R.id.text_view);
                 //onClick  
             }
        }
    

    这样您就知道点击了什么,这样您就知道以后从其他Activity回来时需要更改什么。

    【讨论】:

      猜你喜欢
      • 2020-10-02
      • 1970-01-01
      • 1970-01-01
      • 2013-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多