【问题标题】:Search Json fetch Result data using Kotlin使用 Kotlin 搜索 Json 获取结果数据
【发布时间】:2020-08-03 03:43:42
【问题描述】:

我正在使用 OKhttp 从URL 获取 JSON... 我正在使用 Kotlin。

{
"CountryName": [{
        "Country": "India",
        "CountryCode": "+91",
        "Population": "545121546846"
    },
    {
        "country ": "Pakistan",
        "countryCode": "+92",
        "Population": "23546546546"
    },

    {
        "Country": "UK",
        "CountryCode": "+42",
        "Population": "545121546846"
    },
    {
        "Country": "US",
        "CountryCode": "+1",
        "Population": "54512154545846"
    }


]

}

当成功获取数据时,仅当用户搜索国家并添加到列表并显示其相关数据(如乡村和人口)时才会显示。我能够获取 JSON 数据,但无法像用户搜索并添加到列表时那样控制它。这是我的主要活动

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    recyclerView.layoutManager = LinearLayoutManager(this)

             fetchjson()
     }

//这就是我获取 JSON 的方式

fun fetchjson() {

    val url = "https://firebasestorage.googleapis.com/v0/b/unity-b69ff.appspot.com/o/new.json?alt=media&token=dc24acb2-13aa-40da-b0c5-7bb3ccd59af8"

    val request = Request.Builder().url(url).build()
    val client = OkHttpClient()
    client.newCall(request).enqueue(object: Callback {
        override fun onFailure(call: Call, e: IOException) {

            println("Fail to load json")
        }

        override fun onResponse(call: Call, response: Response) {

            val body = response.body?.string()
            println(body)

            val gson = GsonBuilder().create()
          val homefeed = gson.fromJson(body, HomeFeed::class.java)

            runOnUiThread{
                recyclerView.adapter = MainAdapter(homefeed)

            }

        }
    })

}
      }

这是我的 MainAdapter

 class adapter(val homefeed: jjson) : RecyclerView.Adapter 
   <adapter.CustomViewHolder>(), Filterable {

override fun getItemCount(): Int {
    return homefeed.CountryName.count()
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CustomViewHolder {
    val layoutInflater = LayoutInflater.from(parent.context)
    val cellforRow = LayoutInflater.from(parent.context).inflate(R.layout.item, parent, false)
    return CustomViewHolder(cellforRow)

}

override fun onBindViewHolder(holder: CustomViewHolder, position: Int) {
    val v = homefeed.CountryName.get(position)
    holder.itemView.textView2.text = v.Country
    holder.itemView.textView.text = v.CountryCode.toString()

}

class CustomViewHolder(view: View) : RecyclerView.ViewHolder(view) {}

                         // this filter method 
override fun getFilter(): Filter {
   return (object: Filter(){
       override fun performFiltering(constraint: CharSequence?): FilterResults {
          // TODO("Not yet implemented")
       }

       override fun publishResults(constraint: CharSequence?, results: FilterResults?) {
          // TODO("Not yet implemented")
       }
   })
}


  }
                  //json data object

       class jjson(val CountryName: List<name>)
       class name{
           val Country: String? = null
           val CountryCode: Int? = null
           val Popuplation: Long? = null
                                          }

我可以在提取后执行一些用 JSON 编写的代码吗

【问题讨论】:

  • 你的问题不是很清楚,你能详细说明你的最后一个问题吗?
  • 我上面提到的代码只是在回收者视图中获取所有 json 数据。但是,我希望,在用户搜索和添加项目之前,应用程序和初始列表中的实施搜索视图将为空......
  • 简单地说,我想显示某些数据而不是视图中的所有数据。并且只有当用户搜索除国家名称以外的任何内容时,数据才会按唯一的国家名称搜索,其显示错误。当用户使用国家名称搜索时,它还会显示与该国家名称相关的所有数据。比如,国家代码和人口..
  • 那么,您不想在用户搜索后显示整个国家/地区列表吗?您应该通过用户查询过滤国家/地区列表,并使用过滤后的数据更新适配器。
  • @JuanMartinez 确切地说,我无法解释问题。但是,这是我想要的。而且,初始列表将为空

标签: android json android-studio kotlin search


【解决方案1】:

现在我对你的问题有了更好的理解,我正在写一个答案。

请记住,您的适配器只负责显示一组数据,在本例中是您希望用户看到的国家/地区列表。目前,一旦您收到来自服务器的响应,您只需使用整个国家/地区列表初始化适配器。 您可以做的是使用空列表初始化适配器,在从服务器获取国家/地区时更新适配器数据集,然后在每次用户搜索查询更改时再次更新它。 您可能需要使用不同类型的适配器(例如 ArrayAdapter),以便更轻松地处理列表数据。你可以在这里阅读更多信息:https://developer.android.com/guide/topics/ui/declaring-layout#AdapterViews

设置好适配器后,您需要做的是: 1.用一个空列表初始化它,可以在它的构造函数上完成。
2. 当国家来自服务器时更新其数据集:

adapter.clear()
adapter.addAll(countries)
adapter.notifyDataSetChanged()
  1. 在用户进行搜索时更新其数据集:
adapter.clear()
adapter.addAll(yourFilteredCountries) // you can keep the whole list of countries in a variable in the activity and just pass a filtered list here
adapter.notifyDataSetChanged()

请注意,这是一种超级简单的方法,您可以通过多种方式对其进行改进,但它会帮助您了解适配器的工作原理。

告诉我进展如何

【讨论】:

  • 我应该在哪里插入这段代码,在主活动中还是在适配器中
  • 你应该把它添加到你的活动中
  • .clear(), .addAll(), .notifyDataSetChanged() 在android studio中总是显示错误.即使在导入之后。也许,我以错误的方式插入此代码。请查看我上面的源代码并告诉我正确的位置。请帮我实现过滤方法。
猜你喜欢
  • 2017-05-15
  • 2014-07-27
  • 2014-07-23
  • 2017-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-11
  • 1970-01-01
相关资源
最近更新 更多