Дооснащение 2 - получение ответа 200, но список пуст - PullRequest
0 голосов
/ 18 января 2019

Я пытался получить JSON из этого API: https://api.cointelegraph.com/api/v1/mobile/feed

Я хочу получить поле "заголовок" каждой новости. Я создал класс, который должен получить эти поля и обертку для этого класса, но вместо этого я получаю пустой список, я думаю, это потому, что мне нужно получить поле, которое сначала вызывало «data», а затем анализировать его. Поэтому я изменил свой класс для получения полей "title" на класс для получения поля "data", но я все еще получаю пустой список.

Думаю, это глупая ошибка, потому что она работает с github api. Ниже я приведу какой-то ответ и мой код. Спасибо за попытку помочь.

Ответ Json:

{"data": {"news": [{"type": "header", "data": {"id": 22358, "title": "MIT, Стэнфордские исследователи, чтобы финансировать новые глобальные возможности масштабирования \ u2018" u2019 Криптовалюта, \ u2018Unit-e \ u2019 "," лидерство ":" Крупные университеты США, включая MIT, Стэнфорд и Калифорнийский университет в Беркли, объединились для финансирования новой цифровой валюты. "," 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 ": { "название": "Новости", "метка": "по умолчанию"}, "isSponsored": ложь, "аудио": "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","currency":"USD","isIncreased":1,"difference":"0.17"},{"price":31.56,"name":"LTC","currency":"USD","isIncreased":1,"difference":"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
    }

}

Спасибо за любую помощь

1 Ответ

0 голосов
/ 18 января 2019

Я думаю, вы должны изменить свой интерфейс на

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