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
相关产品推荐
相关产品推荐

