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

如何在Android中用Retrofit将JSON对象转为列表并展示到RecyclerView

实现JSON对象转键值对列表并展示到RecyclerView

完全可以实现这种转换,下面是具体的操作步骤和代码示例:

1. 定义键值对数据模型

首先创建一个用于存储单个键值对的数据类,方便后续RecyclerView适配:

data class LabItem(
    val key: String,
    val value: String
)

如果使用Java:

public class LabItem {
    private String key;
    private String value;

    public LabItem(String key, String value) {
        this.key = key;
        this.value = value;
    }

    public String getKey() { return key; }
    public String getValue() { return value; }
}

2. 解析JSON对象为键值对列表

假设你用Retrofit+Gson处理网络请求,先将服务器返回的JSON解析成JsonObject,再遍历所有键值对生成列表:

// 假设已获取到服务器返回的data对象(JsonObject类型)
val dataJson: JsonObject = response.body()?.getAsJsonObject("data") ?: JsonObject()
val labList = mutableListOf<LabItem>()

// 遍历JsonObject的所有键,生成键值对列表
dataJson.keySet().forEach { key ->
    val value = dataJson.get(key).asString
    // 可选:过滤不需要展示的字段,比如id、created_at等
    if (!listOf("id", "created_at", "updated_at").contains(key)) {
        labList.add(LabItem(key, value))
    }
}

如果使用原生JSONObject解析:

val dataJson = JSONObject(responseString).getJSONObject("data")
val labList = mutableListOf<LabItem>()
val keys = dataJson.keys()

while (keys.hasNext()) {
    val key = keys.next()
    val value = dataJson.getString(key)
    if (!listOf("id", "created_at", "updated_at").contains(key)) {
        labList.add(LabItem(key, value))
    }
}

3. 创建RecyclerView适配器

编写适配器绑定键值对数据,适配管理员增删改数据的场景:

class LabAdapter : RecyclerView.Adapter<LabAdapter.ViewHolder>() {
    private var itemList = mutableListOf<LabItem>()

    // 更新数据的方法,用于数据变动后刷新列表
    fun updateData(newList: List<LabItem>) {
        // 推荐用DiffUtil实现高效更新,避免全量重绘
        val diffResult = DiffUtil.calculateDiff(LabDiffCallback(itemList, newList))
        itemList = newList.toMutableList()
        diffResult.dispatchUpdatesTo(this)
    }

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

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val item = itemList[position]
        holder.tvKey.text = item.key
        holder.tvValue.text = item.value
    }

    override fun getItemCount() = itemList.size

    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val tvKey: TextView = itemView.findViewById(R.id.tv_key)
        val tvValue: TextView = itemView.findViewById(R.id.tv_value)
    }

    // DiffUtil回调类,用于判断数据变动,实现局部刷新
    class LabDiffCallback(private val oldList: List<LabItem>, private val newList: List<LabItem>) : DiffUtil.Callback() {
        override fun getOldListSize() = oldList.size
        override fun getNewListSize() = newList.size
        override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
            return oldList[oldItemPosition].key == newList[newItemPosition].key
        }
        override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
            return oldList[oldItemPosition] == newList[newItemPosition]
        }
    }
}

对应的item布局item_lab.xml示例:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="16dp"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/tv_key"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:textSize="16sp"
        android:textColor="@color/black"/>

    <TextView
        android:id="@+id/tv_value"
        android:layout_width="0dp"
        android:layout_weight="1"
        android:textSize="16sp"
        android:textColor="@color/gray"
        android:gravity="end"/>
</LinearLayout>

4. 初始化RecyclerView并设置数据

在Activity或Fragment中完成RecyclerView的初始化:

val recyclerView = findViewById<RecyclerView>(R.id.recycler_view)
recyclerView.layoutManager = LinearLayoutManager(this)
val adapter = LabAdapter()
recyclerView.adapter = adapter

// 解析完数据后调用更新方法刷新列表
adapter.updateData(labList)

处理数据更新场景

当管理员对数据进行增删改后,重新请求服务器数据,重复步骤2的解析过程,再调用适配器的updateData方法即可高效刷新RecyclerView。

内容的提问来源于stack exchange,提问作者Dr.KeyOk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 03:40:32