如何使用Kotlin,retrofit和RXjava填充列表视图

时间:2017-11-08 00:44:37

标签: android listview kotlin rx-java retrofit2

我与服务的集成已准备就绪,我可以在申请日志中看到我的数组,但我无法填写列表视图。

老实说,我已经尝试过我所知道的一切,我是kotlin的新手,语言让我有点困惑。有人可以确定错误的位置,我做错了。

JSON /请求:

{"0":{"id":1,"nome":"teste"},"1":{"id":2,"nome":"teste 2"}}

apiClient.kt

 val service : ApiInterface
    val URL = "json"

    init {

        val logging = HttpLoggingInterceptor()
        logging.level = HttpLoggingInterceptor.Level.BODY

        val httpClient = OkHttpClient.Builder()
        httpClient.addInterceptor(logging)

        val gson = GsonBuilder().setLenient().create()

        val retrofit = Retrofit.Builder()
                .baseUrl(URL)
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create(gson))
                .client(httpClient.build())
                .build()

        service = retrofit.create<ApiInterface>(ApiInterface::class.java)
    }

ApiInterface.kt

 @Headers("Accept: application/json")
 @GET("/request")
 fun getInstituicoes(): Observable<Instituicao>

Instituicao.kt(实体)

 data class Instituicao(val id: Int, val nome: String)

InstituicaoActivity :: listview

   listView = ListView(this)
        setContentView(listView)
        instituicao = ArrayAdapter(this, android.R.layout.simple_list_item_1, instituicoes)
        listView?.adapter = instituicao

        var api = ApiClient()
        api.service.getInstituicoes()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe({
                    instituicao -> instituicoes.add("${instituicao.id} - ${instituicao.nome}")
                }, {
                    e -> e.printStackTrace()
                }, {
                    instituicao?.notifyDataSetChanged()
                })

    }

结果:(

0-null

1 个答案:

答案 0 :(得分:1)

你的对象就是这个

{"0":
     {"id":1,"nome":"teste"}

Gson希望只将这一部分解析为一个对象

{"id":1,"nome":"teste"}

由于它不能,它已返回null。

如果可能,您需要修复服务器代码以返回对象列表,而不是&#34;索引映射&#34;

服务器响应应为

[
   {"id":1,"nome":"teste"},
   {"id":2,"nome":"teste 2"}
]

修复服务器返回后,需要使用此

更新Retrofit
Observable<List<Instituicao>>

如果这不可能,你需要研究为Gson制作自定义解析器并在Retrofit中注册它们

(...或手动解析您的JSON)