我想检查 index
的 array
是否为空/空,如果是,那么我想在该索引处添加一个新项目,否则用新项目替换旧项目(我不想在数组中保留旧项)。
我尝试了以下代码,但没有用
private var mSelectedImageFileUriList: ArrayList<Uri?>? = null
mSelectedImageFileUriList= ArrayList(5)
if (mSelectedImageFileUriList?.get(1) ===null){
mSelectedImageFileUriList?.add(data.data!!)
}else{
mSelectedImageFileUriList?.set(1,data.data!!)
}
mSelectedImageFileUriList?.add(data.data!!)
是我之前使用过的代码,它运行没有错误。然后我尝试使用 mSelectedImageFileUriList?.set(0,data.data!!)
,应用程序崩溃了。我正在检查位置(索引)是否为 null
,因为它可能已经被占用,如果它被占用,那么我不想要旧数据,相反,我想用新的(新的一个应该在同一个位置。
它基本上用于创建一个 uri
数组。当用户想要更改图像时,也就是当我想检查用户是否已经在 index
处选择了图像时,如果他选择了图像,则必须删除旧的 uri
并新的应该添加到 array
中的相同位置。
共有 5 张图片,array
的大小限制为 5 (mSelectedImageFileUriList= ArrayList(5)
)。当用户添加“image1”时,uri
存储在“index0”,当用户添加“image2”时,uri
存储在“index1”。添加'image2'('index1')后,用户想要编辑(更改)他为'image1'添加的图像,如果我使用mSelectedImageFileUriList?.add(data.data!!)
,它不会删除旧的和新的{{1 }} 被添加到数组的底部,但我希望它在相同的位置,在这种情况下,'index0'。我希望它很清楚。
如果需要,我会添加完整的代码。
uri
logcat
答案 0 :(得分:1)
您不需要检查 null
。因为你总是想更新那个索引,你可以直接设置它。
例如:
fun main() {
val list = mutableListOf("zero","one",null)
println(list)
list[1] = "oneUpdated"
list[2] = "two"
println(list)
}
输出:
[zero, one, null]
[zero, oneUpdated, two]
答案 1 :(得分:1)
正如其他人已经说过的,您不必检查该值是否为空,因为在这两种情况下您都可以简单地执行:
list[index] = value
在你的情况下:
mSelectedImageFileUriList?.set(1, data.data!!)
这段代码完全符合您的要求:替换现有值或“添加”(实际上,也替换)如果它为空。
但我认为您的问题确实出在其他地方。您创建了您的列表:
mSelectedImageFileUriList= ArrayList(5)
您可能认为它创建了一个大小为 5 的列表,但事实并非如此。它创建了一个 capacity
为 5 的列表,但它的大小仍然为 0。它不会创建这样的列表:[null, null, null, null, null]
,而只是:[]
,因此您无法设置例如的值指数=2。
要创建一个包含空值的大小为 5 的列表,请使用以下代码:
mSelectedImageFileUriList = MutableList(5) { null }
您需要将 mSelectedImageFileUriList
的类型从 ArrayList
更改为 MutableList
。这实际上是不鼓励对变量类型使用特定实现类型的原因。
答案 2 :(得分:0)
您已经声明了 ArrayList<Uri?>
,这意味着在您的 ArrayList
中包含 Uri
类型或 null
类型。 null
类型仍然在列表中占据一席之地,不被视为“空”空间。
if (mSelectedImageFileUriList?.get(1) ===null){
mSelectedImageFileUriList?.add(data.data!!)
}else{
mSelectedImageFileUriList?.set(1,data.data!!)
}
考虑到这一点,您的代码片段并不完全符合您在描述中所说的那样。您在这里的代码是说如果索引 1 处的元素为空,则将 data
附加到列表的末尾,例如如果您的列表是 [URI1, null]
,那么您的列表在执行后将变为 [URI1, null, data]
。
无论哪种方式(null
或旧值),您都希望替换索引 1 处的值,因此您无需检查索引 1 处的值是否为 null
和可以只有一个单行设置器:
mSelectedImageFileUriList?.set(1,data.data!!)