简体   繁体   中英

RecyclerVIew onCreateViewHolder and onBindViewHolder is not called

I'm having two fragments 1.UploadFragment - to upload data to firestore 2.FetchFragemnt - fetch data from firestore and display it in recyclerView these two fragments are used in a NavigationDrawer.

My problem is in fetchFragment initially recyclerView displays datas that are fetched from firestore. but when I navigate to UploadFragment and return back to FetchFragment RecyclerView is not loaded.

Also, onCreateViewHolder and onBindViewHolder are not called when I navigate to UploadFragment and return back to FetchFragment.

Please someone help.

FetchFragment code :
class FetchFragment : Fragment(R.layout.fragment_fetch) {
    private lateinit var binding : FragmentFetchBinding
    private lateinit var adapter: PersonsAdapter
    private lateinit var personsList: MutableList<PersonsDb>
    private val personCollectionRef = Firebase.firestore.collection("persons")
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        binding = FragmentFetchBinding.bind(view)
        personsList = mutableListOf()
        adapter = PersonsAdapter(personsList){item ->
            Intent(requireContext(),UpdateActivity::class.java).also{
                it.putExtra("EXTRA_DETAILS",item.id)
                startActivity(it)
            }
        }
        binding.rvPersons.adapter = adapter
        binding.rvPersons.layoutManager = LinearLayoutManager(requireContext())
        fetchPPerson()
        binding.svFilter.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
            override fun onQueryTextSubmit(p0: String?): Boolean {
                //Performs search when user hit the search button on the keyboard
//                adapter.getFilter().filter(p0);
                return false
            }
            override fun onQueryTextChange(p0: String?): Boolean {
                //Start filtering the list as user start entering the characters
                adapter.getFilter().filter(p0);
                return false
            }
        })

    }
    private fun fetchPPerson() = CoroutineScope(Dispatchers.IO).launch{

        try{
            val querySnapshot = personCollectionRef.get().await()
            personsList.clear()
            for(document in querySnapshot.documents){
                val person = document.toObject<Person>()
                personsList.add(
                    PersonsDb(document.id,
                            person?.name.toString(),
                        person?.age.toString().toInt(),
                        Date(person?.dob.toString())
                ))

            }
            withContext(Dispatchers.Main){
                adapter.notifyDataSetChanged()
            }

        }catch (e:Exception){
            withContext(Dispatchers.Main){
                Toast.makeText(requireContext(),e.message, Toast.LENGTH_LONG).show()
                Log.d("Fetch Error", e.message)
            }

        }
    }

}
My Recycler Adapter :
class PersonsAdapter (
    var persons : List<PersonsDb>,
    private val listener: (PersonsDb) -> Unit
):RecyclerView.Adapter<PersonsAdapter.PersonsViewHolder>(),Filterable{
    var personsList = persons
    inner class PersonsViewHolder(val binding : ItemPersonBinding):
            RecyclerView.ViewHolder(binding.root)
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PersonsViewHolder {
        val binding = ItemPersonBinding.inflate(LayoutInflater.from(parent.context),parent,false)
        return PersonsViewHolder(binding)
    }

    override fun getItemCount(): Int {
        return persons.size
    }

    override fun getFilter(): Filter {
        return filter
    }

    override fun onBindViewHolder(holder: PersonsViewHolder, position: Int) {
        val item = persons[position]
        with(holder){
            with(persons[position]){
                binding.tvName.text = this.name
                binding.tvAge.text = this.age.toString()
//                binding.tvDob.text = this.dob.toString()
                binding.tvDob.text = updateDateInView(this.dob)
            }
        }

        holder.itemView.setOnClickListener { listener(item) }
    }

    private fun updateDateInView(cal : Date) : String{
        val myFormat = "dd/MM/yyyy" // mention the format you need
        val sdf = SimpleDateFormat(myFormat, Locale.US)
//        binding.dpDob.setText(sdf.format(cal.getTime()))
        return sdf.format(cal.getTime())
    }

    private val filter: Filter = object : Filter() {
        override fun performFiltering(constraint: CharSequence): FilterResults {
            var filteredList: MutableList<PersonsDb> = arrayListOf()

            if (constraint.isEmpty()) {
                filteredList.addAll(personsList)
            } else {
                val filterPattern = constraint.toString().toLowerCase().trim { it <= ' ' }
                for (item in 0..persons.size -1) {
                    if (persons[item].name.toLowerCase().contains(filterPattern)
                            || persons[item].age.toString().contains(filterPattern)) {
                        filteredList.add(persons[item])
                    }
                }
            }
            val results = FilterResults()
            results.count = filteredList.size
            results.values = filteredList
//            Log.d("Filter Values", results.values.toString())
            return results
        }

        override fun publishResults(charSequence: CharSequence, filterResults: FilterResults) {
            persons = if(filterResults == null || filterResults.values == null){
                personsList
            }
            else
                filterResults.values as List<PersonsDb>
            notifyDataSetChanged()

        }
    }

}

Can you check Item count( log item count ). That way you will know if data exists for recyclerview when returning to FetchFragment. I suspect empty data could be reason.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM