recycleview show wrong data while after filtering its data

Viewed 60

i have a list of data that initialize the recycleview after that user search in this list so i initialize a searchview . i send the results to recycleview's adapter and i can see by log that the results are correct but recycleview dont show this correct filtered data. i try diffutils ,filterable adapter ,... and all of them have this issue

class CardDetailsFilterableAdapter:
RecyclerView.Adapter<CardDetailsFilterableAdapter.CardDetailsViewHolder>(){

//var cardsList: ArrayList<BanksCardModel> = ArrayList()
var cardsListFiltered: ArrayList<BanksCardModel> = ArrayList()

lateinit var mContext:Context

private lateinit var binding: CardItemForListBinding


var onItemClick: ((BanksCardModel) -> Unit)? = null


inner class CardDetailsViewHolder(binding: CardItemForListBinding) :
    RecyclerView.ViewHolder(binding.root) {
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CardDetailsViewHolder {
    mContext=parent.context
    binding = CardItemForListBinding.inflate(LayoutInflater.from(parent.context), parent, false)
    return CardDetailsViewHolder(binding)
}
override fun onBindViewHolder(holder: CardDetailsViewHolder, position: Int) {
    bind(cardsListFiltered.sortedBy { it.id }[holder.absoluteAdapterPosition])
}

private fun bind(item: BanksCardModel) {
   // i check the data in this log and it's correct
    Log.d("onbindViewHolder", item.username)

 
    binding.cardItemCardHolder.setText(item.username)
    binding.bankName.setText(item.bankName)
    setCardOrShebaNumberToViews(item.cardNumber, cardParts)
    setCardOrShebaNumberToViews(item.shabaNumber, shebaParts)
    binding.cardExpireDateMonth.setText(item.expireMonth)
    binding.cardExpireDateYear.setText(item.expireYear)
    binding.cardCvv2Number.setText(item.cvv2Number)
}


override fun getItemCount(): Int = cardsListFiltered.size

fun addData(list: List<BanksCardModel>) {

    cardsListFiltered.clear()
    cardsListFiltered.addAll(list)
    notifyDataSetChanged()
}  
 }

and this is the fragment :

class CardDetails1 : Fragment() {
    private lateinit var binding: CardsDetailsBinding
    private lateinit var filterableAdapter: CardDetailsFilterableAdapter
    var fullListCards: ArrayList<BanksCardModel> = ArrayList()
    private val myViewModel: MyViewModel by viewModels()

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        binding = CardsDetailsBinding.inflate(inflater, container, false)
        return binding.root
    }
    
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        initRecyclerView()
        observeValue()
        binding.cardsListSearchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
            override fun onQueryTextSubmit(query: String?): Boolean {
                return false
            }
            override fun onQueryTextChange(newText: String?): Boolean {
                val temp = ArrayList<BanksCardModel>()
                for (part in fullListCards){
                    if (part.username.contains(newText.toString())){
                        temp.add(part)
                    }
                }
                filterableAdapter.addData(temp)
                return false
            }

        })

    }

    private fun observeValue() {
        myViewModel.getAllCards().observe(viewLifecycleOwner, Observer {
            fullListCards=it
            filterableAdapter.addData(fullListCards)
        })

    }
    private fun initRecyclerView() {
        binding.cardDetailsrecyclerview.layoutManager = LinearLayoutManager(context)
        filterableAdapter = CardDetailsFilterableAdapter()
        binding.cardDetailsrecyclerview.adapter = filterableAdapter

    }

}
0 Answers
Related