我正在尝试学习在 Android 中做事的“Kotlin 原生方式”,同时既不是 Kotlin、Java 也不是 Android 开发的专家。具体来说,何时使用ArrayListvsMutableList。
在我看来,MutableList应该尽可能选择。然而,如果我查看 Android 示例,他们似乎总是选择ArrayList(就我目前发现的而言)。
下面是一个工作示例的片段,它使用ArrayList并扩展了 Java 的RecyclerView.Adapter.
class PersonListAdapter(private val list: ArrayList<Person>,
private val context: Context) : RecyclerView.Adapter<PersonListAdapter.ViewHolder>() {
Run Code Online (Sandbox Code Playgroud)
即使我是从 Android 的 Java 代码中借用的,我是否可以简单地将上述代码编写如下(注意MutableList<>而不是ArrayList<>)?
class PersonListAdapter(private val list: MutableList<Person>,
private val context: Context) : RecyclerView.Adapter<PersonListAdapter.ViewHolder>() {
Run Code Online (Sandbox Code Playgroud)
总是使用MutableListover真的更好ArrayList吗?主要原因是什么?我上面提供的一些链接让我无法理解,但在我看来,这MutableList是一个更松散的实现,在未来更有能力改变和改进。那正确吗?
我有一个包含从 api 提取的数据的列表。但是,我需要对此列表(movieList)进行更改。我需要将索引 0 处的元素与索引 1 处的元素交换。例如:
列表[0] = 电影A,
列表[1] = 电影B
然后
列表[0] = 电影B,
列表[1] = 电影A
我打算执行这些操作的类如下:
data class MovieListDto(
val docs: List<Movie>,
val limit: Int,
val offset: Int,
val page: Int,
val pages: Int,
val total: Int
)
fun MovieListDto.MovieListDtoToMovieList(): List<Movie> {
val movieList = mutableListOf<Movie>()
for (movie in docs) {
if (movie._id == "5cd95395de30eff6ebccde5c" ||
movie._id == "5cd95395de30eff6ebccde5b" ||
movie._id == "5cd95395de30eff6ebccde5d"
) {
movieList.add(movie)
}
}
return movieList
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
我想用不同线程的结果更新列表。
mainFunction(): List<A> {
var x: List<A> = listOf<A>()
val job = ArrayList<Job>()
val ans = mainScope.async {
var i = 0
for (j in (0..5)) {
job.add(
launch {
val res = async {
func1()
}
x += res.await()
}
)
}
job.joinAll()
}
ans.await()
return x
}
fun func1(): List<A> {
//Perform some operation to get list abc
var abc: List<A> = listOf<A>()
delay(1000)
return abc
}
Run Code Online (Sandbox Code Playgroud)
列表“x”未正确更新。有时,它会附加“res”..有时则不会。有没有线程安全的方法来修改这样的列表?
新的实施:
mainFunction(): List<A> {
var x: List<A> = listOf<A>()
val …Run Code Online (Sandbox Code Playgroud) 我想对一些包含数字的字符串进行排序,但经过排序后,它变成了这样["s1", "s10", "s11", ... ,"s2", "s21", "s22"]。在我搜索后,我发现这个问题有同样的问题。但是在我的示例中,我有mutableList<myModel>,并且我必须将所有字符串放入myModel.title例如可变列表中并放入代码下:
val sortData = reversedData.sortedBy {
//pattern.matcher(it.title).matches()
Collections.sort(it.title, object : Comparator<String> {
override fun compare(o1: String, o2: String): Int {
return extractInt(o1) - extractInt(o2)
}
fun extractInt(s: String): Int {
val num = s.replace("\\D".toRegex(), "")
// return 0 if no digits found
return if (num.isEmpty()) 0 else Integer.parseInt(num)
}
})
}
Run Code Online (Sandbox Code Playgroud)
我在.sortedBy和 中有错误Collections.sort(it.title),请帮我解决这个问题。
我有一个包含可变列表的对象
object TrackingEventsList {
var EventDate: String = ""
var EventDescription: String = ""
}
object Waybill {
var WaybillNumber: String = ""
var OriginHub: String = ""
var TrackingEvents: MutableList<TrackingEventsList> = ArrayList()
}
Run Code Online (Sandbox Code Playgroud)
当我尝试添加Waybill.TrackingEvents时,所有先前的实例都被覆盖并复制添加的最后一个TrackingEvent.
private fun fillTracking(events: NodeList) {
var list = TrackingEventsList
for (x: Int in 0 until events.length) {
var tName = (events.item(x) as Element).tagName
var event = (events.item(x).firstChild as Text).wholeText
if (tName == "EventDate") {
list.EventDate = event
}
if (tName == "EventDescription") {
list.EventDescription = …Run Code Online (Sandbox Code Playgroud) MutableList将 a 包装在LiveDataor中的建议方法是什么MutableLiveData,以便可以修改列表并观察它所发生的变化?
我在 Room 中有一些相当短的表(<20 个项目)(它缓存从服务器检索的值)。我想保留这些项目的可变子集;用作其他更大表的查询中的过滤器。我的想法是将 a 分配给我的应用程序中的模型类,并通过将此类包装在或 中MutableList来使其可观察。然后,通过更新这些选择中的项目,我可以触发大型表上的必要查询。MutableLiveDataLiveData
目前我的代码具有以下结构,我已在问题中将其精简为我认为相关的内容。最终我想keyset在更复杂的查询中使用多个。我的简化模型文件如下,
class Model(application : Application) : AndroidViewModel(application)
{
val keys : LiveData<List<Key>>
val keyset : LiveData<MutableList<Key>>
val values : LiveData<List<Value>>
init {
keys = repository.keys
values = repository.values
keyset = mutableListOf<Key>() // I'm not entirely sure how to instantiate LiveData<MutableList<Key>>
}
}
Run Code Online (Sandbox Code Playgroud)
它依赖于存储库,
class Repository(private val queryset : QuerySet)
{
val keys : LiveData<List<Key>> = queryset.getKeys()
val values : …Run Code Online (Sandbox Code Playgroud) 我最近在研究 kotlin 泛型,但我发现了一些奇怪的情况
interface MyItem
fun <ITEM : MyItem> bindItem(items: List<ITEM>?) {
val castedItem = items as List<MyItem>?
}
fun <ITEM : MyItem> bindItem2(items: MutableList<ITEM>?) {
val castedItem = items as MutableList<MyItem>?
}
Run Code Online (Sandbox Code Playgroud)
只有在 MutableList 情况下,编译器才会警告未经检查的 Cast
如果有人知道这种情况,请告诉我。
MutableLiveData<MutableList<object>>在我拥有并且想要创建的ViewModel 中LiveData<List<object>>,但我不知道如何List从MutableList.
这是我想做的:
class AppViewModel : ViewModel() {
private val _tasks = MutableLiveData<MutableList<Task>>(mutableListOf())
val tasks: LiveData<List<Task>> = _tasks
}
Run Code Online (Sandbox Code Playgroud)
(但我收到错误类型不匹配。必需:LiveData<List> 发现:MutableLiveData<MutableList>)
当我将其更改val tasks: LiveData<List<Task>> = _tasks为val tasks: LiveData<MutableList<Task>> = _tasks它时,它可以工作,但我希望List任务中的任务不可编辑。
我从特定文件夹获取文件路径列表,但是当我尝试将其添加到我的可变列表中时,列表仍为空.
var filePath: MutableList<String>? = null
val path = File(getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).path, "BacFo Camera")
if (path.exists()) {
for(i in path.list().iterator()){
filePath?.add("" + path.toString() + "/" + i) //here i=file name
}
}
Run Code Online (Sandbox Code Playgroud)
在运行Debugger之后,值确实存在变量,i但有些可变列表保持为空.我是Kotlin的新手,请帮助!!
我正在将软件从Scala 2.12.8升级到Scala 2.13,并发现根据许多指南(如本指南)已删除了MutableList集合(scala.collection.mutable.MutableList )。
例如,本指南说这是一个已弃用的集合,所以才删除了它,但是在以前的版本中我找不到该类的任何弃用。
“删除了不推荐使用的集合(MutableList,immutable.Stack等)”
我还首先升级到2.12.9(在2.13.0之前的最新版本),以检查是否有任何不推荐使用的注释,以提供有关使用什么的建议,但是在此版本中,该集合也没有被弃用。
我搜索了这个问题,但找不到很好的答案。这个问题对我和将来的升级都将是有益的。
在Scala 2.13中,我应该使用什么代替MutableList?
mutablelist ×10
kotlin ×9
android ×4
list ×3
arraylist ×1
collections ×1
generics ×1
object ×1
scala ×1
scala-2.13 ×1