我在Java中具有以下功能,需要将其转换为Kotlin。
@Override
public void afterTextChanged(Editable s) {
if (s != null && !"".equals(s.toString())) {
int position = (Integer) mHolder.numEdit.getTag();
// Saved to the data variable when the data changes
mData.get(position).put("list_item_inputvalue",
s.toString());
}
}
Run Code Online (Sandbox Code Playgroud)
这是我创建的等效Kotlin代码:
override fun afterTextChanged(s: Editable?) {
if (s != null && "" != s.toString()) {
val position = mHolder.numEdit!!.tag as Int
// Saved to the data variable when the data changes
mData?.get(position).put("list_item_inputvalue", s.toString())
}
}
Run Code Online (Sandbox Code Playgroud)
编译器不喜欢对的调用.put()
。Java中的变量mData为:
private List<Map<String, String>> mData;
Run Code Online (Sandbox Code Playgroud)
和科特林:
var mData: List<Map<String, String>>? = null
Run Code Online (Sandbox Code Playgroud)
为什么编译器不喜欢put
Kotlin中的转换?
更新:
println(mData) = [{list_item_inputvalue=0}, {list_item_inputvalue=1},...]
println(mData?.get(position)) = {list_item_inputvalue=8}
您的问题围绕您的问题中的这一陈述:
var mData: List<Map<String, String>>? = null
Run Code Online (Sandbox Code Playgroud)
在Kotlin中,Map
类型是不可变的,因此没有.put()
方法。这就是您遇到的问题。要解决此问题,只需将此语句更改为:
var mData: List<MutableMap<String, String>>? = null
Run Code Online (Sandbox Code Playgroud)
一秒 '?' 在之后是必需的,mData?.get(position)
因为该语句将返回null
if mData == null
。也就是说,MutableMap<String, String>?
即使.put()
by本身返回的类型,该语句也将返回的类型MutableMap<String, String>
。
总而言之...如果创建可变映射列表,则编译器将对以下语句感到满意:
mData?.get(position)?.put("list_item_inputvalue", s.toString())
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
118 次 |
最近记录: |