I did implemented the ArrayAdapter, but i wanted a more flexible way of doing this..
now i’ve updated my code for RecyclerView but it doesn’t display anything!
I followed a tutorial from start to finish.
My code compiles.
Here is the code of my Adapter:
package com.gunsailor.myapplication.fragments
import android.annotation.SuppressLint
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Filter
import android.widget.Filterable
import android.widget.TextView
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider
import androidx.navigation.fragment.NavHostFragment.Companion.findNavController
import androidx.recyclerview.widget.RecyclerView
import com.gunsailor.myapplication.R
class CityAdapterView(val context: Context, var cities: ArrayList<City>, val fragment: Fragment) : RecyclerView.Adapter<CityAdapterView.Holder>(), Filterable {
val buffer = ArrayList(cities)
inner class Holder(itemView: View): RecyclerView.ViewHolder(itemView), View.OnClickListener
{
val itemName: TextView
val itemLongitude: TextView
val itemLatitude: TextView
init {
itemName = itemView.findViewById<TextView>(R.id.itemName)
itemLongitude= itemView.findViewById<TextView>(R.id.itemLongitude)
itemLatitude= itemView.findViewById<TextView>(R.id.itemLatitude)
}
override fun onClick(v: View?) {
val model = ViewModelProvider(fragment.requireActivity()).get(SharedViewModel::class.java)
model.modifyCoordinatesLocation(cities.get(position).longitude, cities.get(position).latitude)
findNavController(fragment).navigate(R.id.toPostel)
}
}
override fun getFilter(): Filter {
return object : Filter() {
override fun publishResults(charSequence: CharSequence?, filterResults: FilterResults) {
if (filterResults.count > 0) {
cities.clear()
cities.addAll(filterResults.values as ArrayList<City>)
notifyDataSetChanged()
}
}
override fun performFiltering(search: CharSequence): FilterResults {
val queryString = search.toString().lowercase()
val list = ArrayList(buffer)
val filterResults = FilterResults()
if (queryString.isEmpty()) {
filterResults.values = list
filterResults.count = list.size
}else {
val listFiltered = list.filter {
it.name.lowercase().contains(queryString)
}
filterResults.values = listFiltered
filterResults.count = listFiltered.size
}
return filterResults
}
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CityAdapterView.Holder {
val view = LayoutInflater.from(context).inflate(R.layout.list_view_items, parent, false)
return Holder(view)
}
override fun getItemCount(): Int {
return cities.size
}
@SuppressLint("SetTextI18n")
override fun onBindViewHolder(holder: CityAdapterView.Holder, position: Int) {
holder.itemLatitude.setText("latitude :" + cities.get(position).latitude.toString())
holder.itemLongitude.setText("longitude :" + cities.get(position).longitude.toString())
holder.itemName.setText(cities.get(position).name)
}
}
And here is the code of my fragment:
package com.gunsailor.myapplication.fragments
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.SearchView
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.RecyclerView
import com.gunsailor.myapplication.R
import com.gunsailor.myapplication.Utils.StarsUtils
class LocationList : Fragment() {
lateinit var locations: RecyclerView
lateinit var listAdapter: CityAdapterView
lateinit var searchView: SearchView
lateinit var locationList: StarsUtils
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
val viewLayout = inflater.inflate(R.layout.fragment_location_list, container, false)
locations = viewLayout.findViewById(R.id.locations)
searchView = viewLayout.findViewById(R.id.searchView)
locationList = StarsUtils(requireContext(), "France.json")
locationList.parse()
locationList.JSON2Object()
listAdapter = CityAdapterView(
requireContext(),
locationList.cities, this
)
locations.adapter = listAdapter
searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
override fun onQueryTextSubmit(query: String?): Boolean {
if (query != null) {
listAdapter.getFilter().filter(query)
}
return false
}
override fun onQueryTextChange(newText: String?): Boolean {
listAdapter.filter.filter(newText)
return false
}
})
return viewLayout
}
}
I don’t understand what i miss…
Thanks a lot!
I’ve followed a tutorial from start to finish…
And i wear my glasses!