我是kotlin和MVVM的新手,我已经围绕这个问题工作了一个星期了,即使在互联网上搜索了一些代码,也无法得到任何想法。
我正试图编辑或修改改造响应(观察特定类型;根据我的需要说"sf",忽略其他不需要的数据。我使用可变livedata从recylerview的改造响应中获取和更新JSON数据。
这里是JSON数据的链接:http://www.nactem.ac.uk/software/acromine/dictionary.py?sf=HMM
基于JSON响应的数据类:
data class sf(
@SerializedName("sf")
@Expose
val sf : String? = null,
@SerializedName("lfs")
@Expose
val lfs : List<lfs>? = null,
)
data class lfs(
@SerializedName("lf")
@Expose
var lf : String? = null,
@SerializedName("freq")
@Expose
var freq : Int? = null,
@SerializedName("since")
@Expose
var since : Int? = null,
@SerializedName("vars")
@Expose
var vars : List<vars>? = null,
) : Serializable
class vars (
@SerializedName("lf")
@Expose
var lf : String? = null,
@SerializedName("freq")
@Expose
var freq : Int? = null,
@SerializedName("since")
@Expose
var since : Int?
): Serializable
活动代码:
listUsers = mutableListOf()
adapter = WordAdapters(this, listUsers )
recyclerView.adapter = adapter
wordViewModel = ViewModelProviders.of(this,
WordViewModelFactory(this)).get(WordsViewModel::class.java)
wordViewModel!!.getData().observe(this, { t: ArrayList<sf>? ->
listUsers.clear()
t?.let { listUsers.addAll(it)
}
adapter.notifyDataSetChanged()
})
ViewModel:
class WordsViewModel ( context: Context) : ViewModel() {
private var listData = MutableLiveData<ArrayList<sf>>()
init {
val wordRepository: WordsRepository by lazy {
WordsRepository
}
//if (context.isInternetAvailable()) {
listData = wordRepository.getMutableLiveData(context)
// }
}
fun getData(): MutableLiveData<ArrayList<sf>> {
return listData
} }
存储库:
object WordsRepository {
var call: Call<MutableList<sf>>? = null
fun getMutableLiveData(context: Context) : MutableLiveData<ArrayList<sf>> {
val mutableLiveData = MutableLiveData<ArrayList<sf>>()
//context.showProgressBar()
call = NetworkApiClient.apiService.getWordsMatching("HMM")
call!!.enqueue(object : Callback<MutableList<sf>> {
override fun onFailure(call: Call<MutableList<sf>>, t: Throwable) {
//hideProgressBar()
Log.e("error", t.localizedMessage.toString())
}
override fun onResponse(call: Call<MutableList<sf>>, response:
Response<MutableList<sf>>)
{
//hideProgressBar()
if (!response.isSuccessful){
Log.e("Code " , response.code().toString());
return
}
val raw: okhttp3.Response = response.raw()
val usersResponse : MutableList<sf>? = response.body()
/* if (usersResponse != null) {
for( movie in usersResponse[0].lfs!!){
Log.v("MainActivity", movie.vars.toString())
}
}*/
Log.e("Output : ", usersResponse.toString())
usersResponse?.let { mutableLiveData.value = it as ArrayList<sf> }
}
})
return mutableLiveData
}
}
是JSON的基本结构:here "sf"是一个字符串,lfs是数组,根据这个JSON响应链接提供我得到8个lfs数组,但目前解析后的回收计数是1,这是相同的在适配器itemcount方法,所以我得到一行显示在recylerview和其余的被忽略。
JSON响应:
[
{
"sf":"HMM",
"lfs":[
{
"lf":"heavy meromyosin",
"freq":267,
"since":1971,
"vars":[
{
"lf":"heavy meromyosin",
"freq":244,
"since":1971
},
{
"lf":"Heavy meromyosin",
"freq":12,
"since":1975
},
{
"lf":"H-meromyosin",
"freq":5,
"since":1975
},
{
"lf":"heavy-meromyosin",
"freq":4,
"since":1977
},
{
"lf":"heavy meromyosin",
"freq":1,
"since":1976
},
{
"lf":"H-Meromyosin",
"freq":1,
"since":1976
}
]
},
我想忽略"sf"字符串,并解析"sf"也就是"lfs"基于&;lfs"我需要显示数据。
可变活动数据不接受除sf以外的任何其他类型,因为我在它上面放置了观察者。
在你发布的json上,只有一个父项(一个sf),但你实际上是在试图传递8个lfs孩子。您必须在某个地方执行这样的转换,它可以直接在网络调用上,像这样:
usersResponse ?。let {mutableelvedata。Value = it[0]。
考虑两件事:
-
最好检查一下是否" It ">
-
这只适用于当你总是只有一个项目在父数组(这听起来很奇怪,因为如果是这种情况下,那么服务应该返回一个对象,而不是一个列表,作为json的根。如果您将接收多个对象,则必须将响应映射到单个lfs列表中。类似于(伪代码,因为我来自我的手机):
。映射(item ->item.lfs)