【问题标题】:Retrofit 2 - Getting response 200, but list is empty改造 2 - 获得响应 200,但列表为空
【发布时间】:2019-01-17 23:52:13
【问题描述】:

我试图从这个 api 获取一些 json:https://api.cointelegraph.com/api/v1/mobile/feed

我想获取每条新闻的“标题”字段。我创建了应该获取此字段的类和该类的包装器,但我得到的是一个空列表而不是这个,我想这是因为我必须获取字段,它首先称为“数据”然后解析它。所以我将获取“标题”字段的类更改为获取“数据”字段的类,但我仍然得到空列表。

我想这是一个愚蠢的错误,因为它适用于 github api。我将在下面给出某种回应和我的代码。感谢您尝试提供帮助。

Json 响应:

{"data":{"news":[{"type":"header","data":{"id":22358,"title":"MIT,斯坦福研究人员资助新的\u2018Globally Scalable\ u2019 Cryptocurrency, \u2018Unit-e\u2019","lead":"包括麻省理工学院、斯坦福大学和加州大学伯克利分校在内的美国主要大学联手资助一种新的数字货币。","thumb":"https://s3.cointelegraph .com/storage/uploads/view/f7a7d42a1cba645f861ba810d2524f77.jpg","published_at":{"date":"2019-01-17 18:52:00.000000","timezone_type":3,"timezone":"Europe/London "},"share_url":"https://cointelegraph.com/news/mit-stanford-researchers-to-fund-new-globally-scalable-cryptocurrency-unit-e","views":2375,"type" :"news","author":"Helen Partz","author_id":545,"tag":"Blockchain","badge":{"title":"News","label":"default"}, "isSponsored":false,"audio":"https://s3.cointelegraph.com/audio/22358.71732d08-dc28-4787-98b1-46c4e0317916.mp3"}},{"type":"currencies","data ":[{"price":3677.37,"name":"BTC","currency":"USD","isIncreased":1,"difference":"0.89"},{"price":123.57,"name ":"ETH","货币" :"USD","isIncreased":1,"difference":"0.17"},{"price":31.56,"name":"LTC","currency":"USD","isIncreased":1,"差异":"0.19"},{"price":0.33,"name":"XRP","currency":"USD","isIncreased":1,"difference":"1.22"}]}

界面:

package com.hfad.cointask.service

import com.hfad.cointask.model.DataLIst
import com.hfad.cointask.model.NewsList
import retrofit2.Call
import retrofit2.http.*

interface CoinClient {
    @GET("api/v1/mobile/feed")
    fun getFeed(): Call<NewsList>
}

新闻类:

package com.hfad.cointask.model

class News (private var data: String) {

    fun getData(): String{
        return data
    }

}

我第一次尝试这样获得标题

package com.hfad.cointask.model

class News (private var title: String) {

    fun getTitle(): String{
        return title
    }

}

我的新闻类包装器:

package com.hfad.cointask.model

class NewsList {
    var list = mutableListOf<News>()
}

我的适配器:

package com.hfad.cointask.adapter

import android.support.v7.view.menu.MenuView
import android.support.v7.view.menu.MenuView.ItemView
import android.support.v7.widget.RecyclerView
import android.support.v7.widget.RecyclerView.ViewHolder
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import com.hfad.cointask.R
import com.hfad.cointask.model.News

class CoinAdapter(var values: List<News>): RecyclerView.Adapter<CoinAdapter.CoinViewHolder>() {


    override fun onBindViewHolder(p0: CoinViewHolder, p1: Int) {

        val itemTitle: News = values[p1]
        p0.newsTitle.text = itemTitle.getData()

    }

    override fun getItemCount(): Int {

        return values.size

    }

    override fun onCreateViewHolder(p0: ViewGroup, p1: Int): CoinViewHolder {

        val view: View = LayoutInflater.from(p0.context).inflate(R.layout.news_item_view, p0, false)
        return CoinViewHolder(view)

    }

    class CoinViewHolder(itemView: View): ViewHolder(itemView) {

        var newsTitle: TextView = itemView.findViewById(R.id.item_title)

    }
}

还有我的主要活动:

package com.hfad.cointask

import android.os.Bundle
import android.support.design.widget.BottomNavigationView
import android.support.v7.app.AppCompatActivity
import android.support.v7.widget.LinearLayoutManager
import android.support.v7.widget.RecyclerView
import android.widget.Toast
import com.hfad.cointask.adapter.CoinAdapter
import com.hfad.cointask.model.DataLIst
import com.hfad.cointask.model.News
import com.hfad.cointask.model.NewsList
import com.hfad.cointask.service.CoinClient
import kotlinx.android.synthetic.main.activity_feed.*
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory

class FeedActivity : AppCompatActivity() {

    var news = mutableListOf<News>()
    private lateinit var newsRecyclerView: RecyclerView
    private lateinit var newsAdapter: CoinAdapter
    private lateinit var layoutManager: LinearLayoutManager
    private val client = mCoinClient().build()

    private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item ->
        when (item.itemId) {
            R.id.navigation_home -> {
                message.setText(R.string.title_home)
                return@OnNavigationItemSelectedListener true
            }
            R.id.navigation_dashboard -> {
                message.setText(R.string.title_dashboard)
                return@OnNavigationItemSelectedListener true
            }
            R.id.navigation_notifications -> {
                message.setText(R.string.title_notifications)
                return@OnNavigationItemSelectedListener true
            }
        }
        false
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_feed)

        newsRecyclerView = findViewById(R.id.news_recycler_view)
        layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
        newsRecyclerView.layoutManager = layoutManager
        newsAdapter = CoinAdapter(news)
        newsRecyclerView.adapter = newsAdapter

        getNews().enqueue(object: Callback<NewsList>{
            override fun onResponse(call: Call<NewsList>, response: Response<NewsList>) {
                var jsonNews = response.body().list
                news.clear()
                news.addAll(response.body().list)
                newsAdapter.notifyDataSetChanged()
            }

            override fun onFailure(call: Call<NewsList>?, t: Throwable?) {
                val toast = Toast.makeText(this@FeedActivity, t.toString(), Toast.LENGTH_SHORT)
                toast.show()
            }

        })

        navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener)
    }

    private fun getNews() = client.getFeed()

    class mCoinClient {
        private val builder = Retrofit
                .Builder()
                .baseUrl("https://api.cointelegraph.com/")
                .addConverterFactory(GsonConverterFactory.create())

        private val retrofit: Retrofit by lazy {
            builder.build()
        }

        private val client: CoinClient by lazy {
            retrofit.create(CoinClient::class.java)
        }

        fun build() = client
    }

}

感谢您的帮助

【问题讨论】:

    标签: json api kotlin android-recyclerview retrofit2


    【解决方案1】:

    我认为你应该将你的界面更改为

    interface CoinClient {
        @GET("api/v1/mobile/feed")
        fun getFeed(): Call<Your Object that you want to receive it with>
    }
    

    【讨论】:

    • 哦,我已经做了,但是忘记放在这里了。在我的代码中,它看起来像 @GET("api/v1/mobile/feed") fun getFeed(): Call
    猜你喜欢
    • 2020-09-26
    • 2020-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多