如何使用 Klaxon 解析嵌套 JSON 并在 recyclerview 中显示?
Posted
技术标签:
【中文标题】如何使用 Klaxon 解析嵌套 JSON 并在 recyclerview 中显示?【英文标题】:How do I parse nested JSON using Klaxon and display in recyclerview? 【发布时间】:2019-02-02 13:49:18 【问题描述】:这是我的 MainActivity.kt
class MainActivity : AppCompatActivity()
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
var data = Klaxon()
.parseArray<ProductData>(readArray())
if(!data!!.isEmpty())
recyclerView.layoutManager = LinearLayoutManager(this)
recyclerView.hasFixedSize()
recyclerView.adapter = ListAdapter(data, partItem : ProductData -> partItemClicked(partItem))
private fun partItemClicked(partItem : ProductData)
Toast.makeText(this, "You click $partItem.title", Toast.LENGTH_SHORT).show()
val showDetailActivityIntent = Intent(this, DetailProduct::class.java)
showDetailActivityIntent.putExtra(Intent.EXTRA_TEXT, partItem.title)
startActivity(showDetailActivityIntent)
private fun readArray(): String
return application.assets.open("products.json").bufferedReader().use
it.readText()
这是我的适配器,ListAdapter.kt
class ListAdapter (var catalogList: List<ProductData>, var clickListener: (ProductData) -> Unit) :
RecyclerView.Adapter<RecyclerView.ViewHolder>()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder
var v = LayoutInflater.from(parent.context).inflate(R.layout.product_catalog_list, parent, false)
return ListHolder(v)
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int)
(holder as ListHolder).bind(catalogList[position], clickListener)
override fun getItemCount() = catalogList.size
class ListHolder(itemView: View) : RecyclerView.ViewHolder(itemView)
fun bind(_list: ProductData, clickListener: (ProductData) -> Unit)
itemView.nama_produk.text = _list.title
itemView.deskripsi_produk.text = _list.snip
itemView.harga.text = _list.calc.toString()
itemView.setOnClickListener clickListener(_list)
我的 JSON 文件 products.json
"snippets": [
"title": "Huben Tarikan Laci Sabit TH-211",
"snip": "Handle lemari atau laci dapat memudahkan penggunaan pada furniture rumah dengan ukuran yang bervariasi, desain ..<br \/>",
"calc": 0
,
"title": "Huben Rak Piring Stainless RP + Ukuran",
"snip": "Huben rak piring dengan bahan stainless berkualitas sangat awet dan tahan lama ideal untuk keperluan dapur anda Huben ..<br \/>",
"calc": 0
,
"title": "Huben Tarikan Laci TA-24 ",
"snip": "Tarikan laci huben berbahan stainless steel sangat awet dan tahan lama serta simple, gunakan tarikan ini sebagai ..<br \/>",
"calc": 0
,
"title": "Yane A 910 Handle Laci Wooden \/ Tarikan Laci ",
"snip": " Tarikan laci kayu tidak pernah kalah dengan bahan stainless karena mampu mempercantik tampilan laci atau lemari. ..<br \/>",
"calc": 0
,
"title": "Yane B - I006C Kitchen Set \/ Rak Dapur ",
"snip": " Ayo gunakan rak dapur kitchen set untuk menjaga kerapihan pada dapur Rak dapur minimalis sebagai tempat untuk ..<br \/><span class=\"priOffi\">Rp 549.000<\/span><small class=\"unit\"> \/ item<\/small>",
"calc": 0
,
"title": "Yane AI 002 L Kitchen Set \/ Rak Dapur ",
"snip": " Ayo beli dan gunakan rak dapur untuk menyimpan stok makanan agar rapi dan aman Rak dapur solusi untuk menyimpan barang ..<br \/><span class=\"priOffi\">Rp 4.399.000<\/span><small class=\"unit\"> \/ item<\/small>",
"calc": 0
]
我应该在我的klaxon()中做什么,来调用嵌套在“sn-ps”中的“title”?
数据类怎么样?我应该申报什么? 我不明白如何使用 recyclerview 显示调用嵌套 JSON 中的数据,尤其是使用 Klaxon。
【问题讨论】:
【参考方案1】:您的数据类将是
data class ProductData(val snippets: List<SnippetsItem>?)
data class SnippetsItem(val snip: String = "",
val calc: Int = 0,
val title: String = "")
和解析器 json
val jsonFile= assets.open("myjson.json")
val result = Klaxon().parse<ProductData>(InputStreamReader(jsonFile))
val list = result?.snippets ?: emptyList()
这是列表。您将此列表发送到您的回收站视图适配器。修改你的适配器
class ListAdapter(var catalogList: List<SnippetsItem>, var clickListener: ClickListener)
: RecyclerView.Adapter<ListAdapter.ListHolder>()
interface ClickListener
fun click(snip: SnippetsItem)
inner class ListHolder(itemView: View) : RecyclerView.ViewHolder(itemView),
View.OnClickListener
override fun onClick(v: View?)
val pos = adapterPosition
clickListener.click(catalogList[pos])
fun bind(snip: SnippetsItem)
//bind with view
itemView.setOnClickListener(this)
现在是主要活动
class MainActivity : AppCompatActivity(),ListAdapter.ClickListener
override fun click(snip: SnippetsItem)
//do whatever you want
【讨论】:
1.类“ListAdapter”不是抽象的,也没有实现抽象基类成员@NonNull public abstract fun onCreateViewHolder(@NonNull p0: ViewGroup, p1: Int): ListAdapter.ListHolder 定义在 android.support.v7.widget.RecyclerView.Adapter 这个是错误,所以我在类前面添加了抽象。 2.从不使用变量“列表”。这是来自解析 json。我把它放在MainActivity.kt这个怎么样? 对不起,我今天很忙。你的问题解决了吗?您刚刚将这些方法添加到令人兴奋的方法中以上是关于如何使用 Klaxon 解析嵌套 JSON 并在 recyclerview 中显示?的主要内容,如果未能解决你的问题,请参考以下文章
Android Kotlin + Klaxon - 解析 JSON 根数组
如何将复杂(嵌套)对象解析为 JSON 并在 Flutter 中使用 HTTP 将其发送到服务器?