You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android下如何解析The-Odds-API的JSON响应并构建RecyclerView

嘿,别着急,你已经迈出了关键一步——拿到了events数据!接下来咱们一步步把这些数据变成漂亮的赛事列表RecyclerView,很简单的:

1. 先把JSON数据转成可操作的实体类

首先得把API返回的赛事结构映射成Kotlin/Java类,这样你就能像操作普通对象一样获取参赛方、赛事名称这些信息了。以Kotlin为例,根据那个API的返回结构,咱们先写两个数据类:

// 对应整个API的返回结构
data class ApiResponse(
    val success: Boolean,
    val data: List<SportEvent>, // 这就是你拿到的events数组
    val msg: String? // 用来处理错误信息
)

// 单个赛事的实体类,包含你需要的参赛方等信息
data class SportEvent(
    val id: String,
    val title: String,
    val home_team: String, // 主队
    val away_team: String, // 客队
    val commence_time: String? // 可选,如果你需要开赛时间的话
)

注意:字段名要和API返回的JSON字段完全一致,如果想自定义字段名,可以用@SerializedName("home_team")注解来映射

2. 解析JSON获取赛事列表和数量

你已经有了JSON响应,接下来用Gson(最常用的解析库)来解析就好。首先在build.gradle(Module级)里加依赖:

implementation 'com.google.code.gson:gson:2.10.1'

然后解析代码示例:

// 假设你已经通过网络请求拿到了JSON字符串responseBody
val gson = Gson()
val apiResponse = gson.fromJson(responseBody, ApiResponse::class.java)

// 获取赛事列表
val eventList = apiResponse.data
// 获取赛事数量直接取列表长度就行
val eventCount = eventList.size

如果用Java的话,思路是一样的,只是语法稍有不同,比如用new Gson().fromJson(responseBody, ApiResponse.class)。

3. 打造RecyclerView的适配器和布局

接下来要做的是把每个赛事项显示出来,先写item布局(res/layout/item_event.xml):

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="16dp"
    android:background="?android:attr/selectableItemBackground">

    <TextView
        android:id="@+id/tv_event_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:textStyle="bold"
        android:text="赛事标题"/>

    <TextView
        android:id="@+id/tv_teams"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="16sp"
        android:layout_marginTop="8dp"
        android:text="主队 vs 客队"/>
</LinearLayout>

然后写RecyclerView的适配器类:

class EventAdapter(private val eventList: List<SportEvent>) : RecyclerView.Adapter<EventAdapter.EventViewHolder>() {

    // ViewHolder用来缓存item里的控件,提升性能
    inner class EventViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val eventTitleTv: TextView = itemView.findViewById(R.id.tv_event_title)
        val teamsTv: TextView = itemView.findViewById(R.id.tv_teams)
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): EventViewHolder {
        // 加载item布局
        val itemView = LayoutInflater.from(parent.context)
            .inflate(R.layout.item_event, parent, false)
        return EventViewHolder(itemView)
    }

    override fun onBindViewHolder(holder: EventViewHolder, position: Int) {
        // 给每个item绑定数据
        val currentEvent = eventList[position]
        holder.eventTitleTv.text = currentEvent.title
        holder.teamsTv.text = "${currentEvent.home_team} vs ${currentEvent.away_team}"
    }

    override fun getItemCount(): Int {
        // 返回赛事数量,也就是列表长度
        return eventList.size
    }
}
4. 在Activity/Fragment中配置RecyclerView

最后一步就是把适配器和RecyclerView绑定起来,在你的Activity代码里:

// 先找到布局里的RecyclerView
val eventsRecyclerView = findViewById<RecyclerView>(R.id.recycler_view_events)

// 设置布局管理器,这里用线性布局,也就是垂直列表
eventsRecyclerView.layoutManager = LinearLayoutManager(this)

// 创建适配器并设置给RecyclerView
val eventAdapter = EventAdapter(eventList)
eventsRecyclerView.adapter = eventAdapter

// 可选:给列表加分割线,看起来更清晰
eventsRecyclerView.addItemDecoration(
    DividerItemDecoration(this, DividerItemDecoration.VERTICAL)
)
一些额外的小提醒
  • 网络请求一定要在子线程做!Kotlin用Coroutines,Java用Executor或者RxJava,别在主线程请求,不然会触发ANR。
  • 别忘了在AndroidManifest.xml里加网络权限:<uses-permission android:name="android.permission.INTERNET"/>
  • 如果赛事列表为空,记得加个空状态提示(比如一个TextView显示“暂无赛事”),提升用户体验。

内容的提问来源于stack exchange,提问作者MarkyMark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:22:02