在循环编辑文本列表时访问下一个元素

Access next element while looping a list of edittexts

我有一个编辑文本列表。我遍历它们并检查它们是否有文本,如果有,我让它们可见。有一个警告,我还需要列表中的下一个编辑文本来显示,即使它没有文本。是否可以访问循环中的下一个元素并使其可见?

例如,如果我有 5 个编辑文本,而 et 1 -> 3 中有文本,下面的循环将使它们可见。但是我还需要et 4来显示,但不是et 5。只是文本停止后的那个。

       lifecycleScope.launch(Dispatchers.Default) {
                val etList = createEditTextList()

       etList.forEach { item ->
                    withContext(Dispatchers.Main) {
                        if (!item.text.isNullOrEmpty()) {
                            item.visibility = View.VISIBLE
                        }
                    }
                }



   private fun createEditTextList(): List<EditText> {
    with(binding) {
        return listOf(
            etChallenges1,
            etChallenges2,
            etChallenges3,
            etChallenges4,
            etChallenges5,
            etChallenges6,
            etChallenges7,
            etChallenges8,
            etChallenges9,
            etChallenges10
        )
    }
}

首先,我建议您避免在顶级协程中调用阻塞函数。如果你把 createEditTextList() 变成一个挂起函数,像这样:

private suspend fun createEditTextList() = withContext(Dispatchers.Default) {
    //...
}

那么你上面的代码可以简化为:

lifecycleScope.launch {
    val etList = createEditTextList()

    etList.forEach { item ->
        if (!item.text.isNullOrEmpty()) {
            item.visibility = View.VISIBLE
        }
    }
}

为了能够处理下一项,在索引上使用传统的 for 循环:

lifecycleScope.launch {
    val etList = createEditTextList()

    for (index in etList.indices) { 
        val item = etList[index]
        if (!item.text.isNullOrEmpty()) {
            item.visibility = View.VISIBLE
            if (index + 1 < etList.size) {
                etList[index + 1].visibility = View.VISIBLE
            }
        }
    }
}

我认为你处理协程的方式和你正在处理的实际对象除了你的问题之外,它们是额外的信息。

如果我们只假设一个简单的对象,就更容易解释您的需求:

data class MyClass(
    val text: String,
    var visible: Boolean
)

因为我们有一个列表,我们可以简单地使用windowed。这将以您想要的任何形式对元素进行分组,并采取您想要的任何步骤。所以像这样简单的东西应该可以工作:

val list = listOf(
    MyClass("a", false),
    MyClass("b", false),
    MyClass("", false),
    MyClass("", false),
    MyClass("e", false)
)

list.windowed(size = 2, step = 1, partialWindows = true)
    .forEach { window: List<MyClass> ->
        val first = window.first()
        val second = window.last()

        if (first.text.isNotBlank()) {
            first.visible = true
            second.visible = true
        }
    }

println(list)

结果将是:

[
MyClass(text=a, visible=true), 
MyClass(text=b, visible=true), 
MyClass(text=, visible=true), 
MyClass(text=, visible=false), 
MyClass(text=e, visible=true)
]

我们需要将 partialWindows 设置为 true,否则如果我们有奇数个元素,那么最后一个元素将不会是任何组中的“第一个”。