Как анализировать данные JSON, используя модификацию и rx? - PullRequest
0 голосов
/ 30 октября 2018

Я пытаюсь получить данные из JSON, используя модификацию и rx. Я следовал этому уроку . Но JSON из этого урока немного отличается от моего. Так что я просто изменил, как немного разобрать. Но если я получу JSON или нет, потому что я не знаю, откуда я знаю, что JSON уже вызван или нет, и в приложении он ничего не показывал.

Если кто-нибудь знает, как это работает и как сделать разбор, пожалуйста, наставьте меня.

Это мой код, в котором я хочу проанализировать данные JSON во фрагменте.

override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    rv__list_posts?.layoutManager = LinearLayoutManager(this.requireContext())

    val retrofit = Retrofit.Builder().addConverterFactory(GsonConverterFactory.create(GsonBuilder().create()))
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .baseUrl("https://www.thesportsdb.com/").build()

    val postsApi = retrofit.create(INetworkAPI::class.java)

    var response = postsApi.getAllPosts()

    response.observeOn(AndroidSchedulers.mainThread()).subscribeOn(IoScheduler()).subscribe {
        rv__list_posts.adapter = MainAdapter(listOf(it), this.requireContext())
    }
}

Это мой интерфейс:

interface INetworkAPI {
  @GET("api/v1/json/1/eventslast.php?id=133602")
  fun getAllPosts(): Observable<Team>
}

Это адаптер:

class MainAdapter(val postList: List<Team>, val context: Context) :
  RecyclerView.Adapter<MainAdapter.ViewHolder>() {

  override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): 
  ViewHolder {
    return 
    ViewHolder(LayoutInflater.from(context).inflate(R.layout.item_layout,parent,false))
  }

  override fun getItemCount(): Int {
      return 10
  }

  override fun onBindViewHolder(holder: ViewHolder, position: Int) {
    holder.itemView.home_team.text = postList.get(position).homeTeam
    holder.itemView.home_score.text = postList.get(position).homeScore.toString()
    holder.itemView.away_team.text = postList.get(position).awayTeam
    holder.itemView.away_score.text = postList.get(position).awayScore.toString()
  }
  class ViewHolder(view: View) : RecyclerView.ViewHolder(view)
}

Ценю вашу помощь.

1 Ответ

0 голосов
/ 30 октября 2018

Ваш ответ API имеет следующую структуру: enter image description here

Вам нужно сделать более сложную модель. Например, вы можете сделать TeamResponse класс:

data class TeamResponse(var results: List<Team>)

И изменить INetworkAPI на:

interface INetworkAPI {
  @GET("api/v1/json/1/eventslast.php?id=133602")
  fun getAllPosts(): Observable<TeamResponse>
}

Тогда в вашем фрагменте:

response
   .observeOn(AndroidSchedulers.mainThread())
   .subscribeOn(IoScheduler())
   .subscribe {
      rv__list_posts.adapter = MainAdapter(it.results, this.requireContext())
   }

EDIT: Вы можете увидеть все ваши API-интерфейсы в LogCat (вы можете увидеть запросы и ответы). Для этого добавьте зависимость:

 implementation "com.squareup.okhttp3:logging-interceptor:3.9.1"

А затем смените модификатор сборки:

val retrofit = Retrofit.Builder().addConverterFactory(GsonConverterFactory.create(GsonBuilder().create()))
        .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
        .baseUrl("https://www.thesportsdb.com/")
        .client(getClient())
        .build()

getClient() код:

private fun getClient(): OkHttpClient {
    val clientBuilder = OkHttpClient.Builder();
    if (BuildConfig.DEBUG) {
        val loggingInterceptor = HttpLoggingInterceptor();
        loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        clientBuilder.addInterceptor(loggingInterceptor);
    }
    return clientBuilder.build();
}

И измените все поля Int с Team model на String (все они являются String в ответе).

...