DEV Community

Devika Android
Devika Android

Posted on

Filtered Adapter with MVVM Architere in Android Development

Implemented In-App Purchases (monthly & yearly subscription plans), integrated REST APIs, and built interactive maps and graph-based data visualizations to enhance user experience and functionality.

@AndroidEntryPoint
class ThirdFragment : Fragment() {
   lateinit var binding: FragmentThirdBinding

   private lateinit var viewModel: UserViewModel
   private lateinit var adapter: UserAdapter

   private var currentPage = 1
   private val limit = 10
   override fun onCreateView(
       inflater: LayoutInflater, container: ViewGroup?,
       savedInstanceState: Bundle?
   ): View {
       binding = FragmentThirdBinding.inflate(inflater, container, false)
       viewModel = ViewModelProvider(this)[UserViewModel::class.java]
       intiView()
       return binding.root
   }

   private fun intiView() {

       binding.etSearch.addTextChangedListener(object : TextWatcher {
           override fun afterTextChanged(s: Editable?) {
               adapter.filter(s.toString())
           }
           override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
           override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {}
       })


       binding.btnNext.setOnClickListener {
           currentPage++
           viewModel.loadPosts(currentPage, limit)
           Log.e("TAG", "intiView: $currentPage")
       }

       binding.btnPre.setOnClickListener {
           if (currentPage > 1) {
               currentPage--
               viewModel.loadPosts(currentPage, limit)
               Log.e("TAG", "intiView:iiii  $currentPage")
           }
       }

       adapter = UserAdapter()
       binding.rvData.adapter = adapter
       binding.rvData.layoutManager = LinearLayoutManager(requireActivity())

       observeData()
       viewModel.loadPosts(currentPage, limit)

   }


   private fun observeData() {

       viewModel.posts.observe(requireActivity()) {
           adapter.addAll(ArrayList(it))
       }
   }

}
class UserAdapter : RecyclerView.Adapter<UserAdapter.UserData>() {
   private var originalList: List<UserInfo> = emptyList()
   private var filteredList: MutableList<UserInfo> = mutableListOf()

   override fun onCreateViewHolder(
       parent: ViewGroup,
       viewType: Int
   ): UserData {
       val binding =
           UserListDesignBinding.inflate(LayoutInflater.from(parent.context), parent, false)
       return UserData(binding)
   }

   override fun onBindViewHolder(
       holder: UserData,
       position: Int
   ) {
       val itemData = filteredList[position]
       holder.setData(itemData)
   }

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

   fun addAll(userList: ArrayList<UserInfo>) {
       this.originalList = ArrayList()
       this.filteredList = ArrayList()
       this.originalList = userList
       this.filteredList.addAll(userList)
       notifyDataSetChanged()
   }

   fun filter(query: String) {
       if (query.isEmpty()) {
           filteredList = originalList.toMutableList()
       } else {
           filteredList = originalList.filter {
               it.title.contains(query, ignoreCase = true)
           }.toMutableList()
       }
       notifyDataSetChanged()
   }

   class UserData(private val binding: UserListDesignBinding) :
       RecyclerView.ViewHolder(binding.root) {

       fun setData(data: UserInfo) {
           binding.tvTitle.text = data.title
           binding.tvDescription.text = data.body
           binding.tvId.text = "ID :- ${data.id}"
           binding.tvUserId.text = "UserID :- ${data.userId}"
       }

   }
}
Enter fullscreen mode Exit fullscreen mode

using without Filter Function we can Filter all list in adapter.

Top comments (0)