Поиск Json выборка данных результатов с использованием Kotlin - PullRequest
0 голосов
/ 20 апреля 2020

Я получаю JSON с URL , используя OKhttp ... Я использую 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()
     }

// Это как я fetch 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)

            }

        }
    })

}
      }

Это мой главный адаптер

 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 ПОСЛЕ ПОЛУЧЕНИЯ ПОСЛЕ

1 Ответ

1 голос
/ 20 апреля 2020

Теперь, когда я немного лучше понимаю вашу проблему, я пишу ответ.

Помните, что ваш адаптер заботится только о отображении набора данных, в данном случае список стран, которые вы хотите пользователь, чтобы увидеть. В настоящее время вы просто инициализируете адаптер со всем списком стран, как только получите ответ от сервера. Вы могли бы инициализировать адаптер с пустым списком, обновлять набор данных адаптера, когда страны выбираются с сервера, а затем обновлять его каждый раз, когда изменяется пользовательский поисковый запрос. Вам может понадобиться использовать адаптер другого типа (например, ArrayAdapter), чтобы упростить работу с данными списка. Вы можете прочитать больше об этом здесь: https://developer.android.com/guide/topics/ui/declaring-layout#AdapterViews

После того, как вы настроили свой адаптер, вам нужно сделать следующее: 1. Инициализировать его с пустым списком, это может быть сделано на его конструкторе.
2. Обновите свой набор данных, когда страны приходят с сервера:

adapter.clear()
adapter.addAll(countries)
adapter.notifyDataSetChanged()
Обновите свой набор данных, когда пользователь выполняет поиск:
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()

Обратите внимание, что это очень простой подход, и вы можете улучшить его многими способами, но он поможет вам понять, как работают адаптеры. работа.

Дайте мне знать, как это происходит

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...