【问题标题】:How do I parse nested JSON using Klaxon and display in recyclerview?如何使用 Klaxon 解析嵌套 JSON 并在 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&nbsp;..<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&nbsp;..<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&nbsp;..<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.&nbsp;..<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&nbsp;..<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&nbsp;..<br \/><span class=\"priOffi\">Rp 4.399.000<\/span><small class=\"unit\"> \/ item<\/small>",
        "calc": 0
      }
      ]
}

我应该在我的klaxon()中做什么,来调用嵌套在“sn-ps”中的“title”?

数据类怎么样?我应该申报什么? 我不明白如何使用 recyclerview 显示调用嵌套 JSON 中的数据,尤其是使用 Klaxon。

【问题讨论】:

    标签: android android-recyclerview kotlin nestedrecyclerview 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这个怎么样?
    • 对不起,我今天很忙。你的问题解决了吗?您刚刚将这些方法添加到令人兴奋的方法中
    猜你喜欢
    • 1970-01-01
    • 2019-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    相关资源
    最近更新 更多