简体   繁体   English

RecyclerVIew onCreateViewHolder 和 onBindViewHolder 没有被调用

[英]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.我有两个片段1.UploadFragment - 将数据上传到 firestore 2.FetchFragemnt - 从 firestore 获取数据并在 recyclerView 中显示这两个片段在 NavigationDrawer 中使用。

My problem is in fetchFragment initially recyclerView displays datas that are fetched from firestore.我的问题是在 fetchFragment 最初 recyclerView 显示从 firestore 获取的数据。 but when I navigate to UploadFragment and return back to FetchFragment RecyclerView is not loaded.但是当我导航到 UploadFragment 并返回 FetchFragment 时,RecyclerView 没有加载。

Also, onCreateViewHolder and onBindViewHolder are not called when I navigate to UploadFragment and return back to FetchFragment.此外,当我导航到 UploadFragment 并返回 FetchFragment 时,不会调用 onCreateViewHolder 和 onBindViewHolder。

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.这样你就可以在返回 FetchFragment 时知道 recyclerview 的数据是否存在。 I suspect empty data could be reason.我怀疑空数据可能是原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 RecyclerView中没有调用适配器的onCreateViewHolder和onBindViewHolder方法? - Adapter onCreateViewHolder and onBindViewHolder methods are not getting called in RecyclerView? RecyclerView.Adapter的onCreateViewHolder和onBindViewHolder方法没有被调用 - RecyclerView.Adapter's onCreateViewHolder and onBindViewHolder methods are not getting called RecyclerView在onCreateViewHolder而非onBindViewHolder处设置onclick事件 - RecyclerView setting onclick event at onCreateViewHolder, not onBindViewHolder RecyclerView 同时为所有项目调用 onCreateViewHolder 和 onBindViewHolder - RecyclerView calling onCreateViewHolder and onBindViewHolder for all items at once 支持库和RecyclerView onBindViewHolder和onCreateViewHolder的Proguard问题 - Proguard issue with Support Library and RecyclerView onBindViewHolder and onCreateViewHolder Recyclerview 不调用任何 Adapter 方法:onCreateViewHolder、onBindViewHolder - Recyclerview not call any Adapter method: onCreateViewHolder, onBindViewHolder RecyclerView onCreateViewHolder未调用 - RecyclerView onCreateViewHolder not called RecyclerView onCreateViewHolder未被调用 - RecyclerView onCreateViewHolder not being called RecyclerView 适配器`onCreateViewHolder` &amp; `onBindViewHolder` 只调用一次 - RecyclerView adapter `onCreateViewHolder` & `onBindViewHolder` invoked only once Recyclerview 不调用任何适配器方法 :onCreateViewHolder,onBindViewHolder, - Recyclerview not call any Adapter method :onCreateViewHolder,onBindViewHolder,
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM