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

