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
}
}