From cd1be9572ade18ddb8fb0b26d2bdbe9052840c45 Mon Sep 17 00:00:00 2001 From: Youssef Raafat Date: Tue, 27 Aug 2019 14:26:29 +0200 Subject: [PATCH] [APP] Add Basic SearchBox --- .../vaccination/adapters/ParentsAdapter.kt | 54 +++++++++++++++++++ .../uah/vaccination/fragments/HomeFragment.kt | 47 ++++++++++++++-- app/app/src/main/res/layout/fragment_home.xml | 26 ++++++--- app/app/src/main/res/layout/item_parent.xml | 7 +++ app/app/src/main/res/values/strings-ar.xml | 1 + 5 files changed, 125 insertions(+), 10 deletions(-) create mode 100644 app/app/src/main/java/uah/vaccination/adapters/ParentsAdapter.kt create mode 100644 app/app/src/main/res/layout/item_parent.xml diff --git a/app/app/src/main/java/uah/vaccination/adapters/ParentsAdapter.kt b/app/app/src/main/java/uah/vaccination/adapters/ParentsAdapter.kt new file mode 100644 index 0000000..ee861e4 --- /dev/null +++ b/app/app/src/main/java/uah/vaccination/adapters/ParentsAdapter.kt @@ -0,0 +1,54 @@ +package uah.vaccination.adapters + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Filter +import android.widget.Filterable +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import uah.vaccination.R +import uah.vaccination.models.Parent + +class ParentsAdapter(val parents: ArrayList) : + RecyclerView.Adapter(), Filterable { + + private var filteredParents = parents + + override fun getItemCount() = filteredParents.size + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = + ParentHolder(LayoutInflater.from(parent.context).inflate(R.layout.item_parent, parent, false)) + + override fun onBindViewHolder(holder: ParentHolder, position: Int) { + val parent = filteredParents[position] + holder.emailTextView.text = parent.email + } + + override fun getFilter() = filteringStrategy + + private val filteringStrategy: Filter = object : Filter() { + + override fun performFiltering(p0: CharSequence?): FilterResults { + val query = p0.toString() + val filteredList = if (query.isNotEmpty()) { + parents.filter { it.email!!.contains(query, true) } as ArrayList + } else { + parents + } + return FilterResults().also { it.values = filteredList } + } + + @Suppress("UNCHECKED_CAST") + override fun publishResults(p0: CharSequence?, p1: FilterResults?) { + filteredParents = p1!!.values as ArrayList + notifyDataSetChanged() + } + + } + + inner class ParentHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + internal var emailTextView: TextView = itemView.findViewById(R.id.email_text_view) + } + +} \ No newline at end of file diff --git a/app/app/src/main/java/uah/vaccination/fragments/HomeFragment.kt b/app/app/src/main/java/uah/vaccination/fragments/HomeFragment.kt index d9a3b15..a53294b 100644 --- a/app/app/src/main/java/uah/vaccination/fragments/HomeFragment.kt +++ b/app/app/src/main/java/uah/vaccination/fragments/HomeFragment.kt @@ -1,18 +1,57 @@ package uah.vaccination.fragments import android.os.Bundle +import android.text.Editable +import android.text.TextWatcher import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.EditText import androidx.fragment.app.Fragment +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.google.firebase.firestore.FirebaseFirestore import uah.vaccination.R +import uah.vaccination.adapters.ParentsAdapter +import uah.vaccination.models.Parent class HomeFragment : Fragment() { - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - // Inflate the layout for this fragment - return inflater.inflate(R.layout.fragment_home, container, false) - } + private lateinit var adapter: ParentsAdapter + private var parents = arrayListOf() + private val firestore = FirebaseFirestore.getInstance() + + override fun onCreateView( + inflater: LayoutInflater, + container: ViewGroup?, + savedInstanceState: Bundle? + ): View? { + + firestore.collection("parents") + .get() + .addOnSuccessListener { result -> + for (document in result) { + parents.add(document.toObject(Parent::class.java)) + } + } + + val rootView = inflater.inflate(R.layout.fragment_home, container, false) + val parentsRecyclerView = rootView.findViewById(R.id.parents_recycler_view) as RecyclerView // Add this + val searchEditText = rootView.findViewById(R.id.search_edit_text) as EditText // Add this + adapter = ParentsAdapter(parents) + parentsRecyclerView.adapter = adapter + parentsRecyclerView.layoutManager = LinearLayoutManager(activity) + + searchEditText.addTextChangedListener(object : TextWatcher { + override fun afterTextChanged(p0: Editable?) = Unit + override fun beforeTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) = Unit + override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) { + adapter.filter.filter(s.toString()) + } + }) + + return rootView + } } diff --git a/app/app/src/main/res/layout/fragment_home.xml b/app/app/src/main/res/layout/fragment_home.xml index db5ec0e..4b4949b 100644 --- a/app/app/src/main/res/layout/fragment_home.xml +++ b/app/app/src/main/res/layout/fragment_home.xml @@ -1,12 +1,26 @@ + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context=".fragments.HomeFragment"> - - + android:orientation="vertical"> + + + + + + + \ No newline at end of file diff --git a/app/app/src/main/res/layout/item_parent.xml b/app/app/src/main/res/layout/item_parent.xml new file mode 100644 index 0000000..a74b933 --- /dev/null +++ b/app/app/src/main/res/layout/item_parent.xml @@ -0,0 +1,7 @@ + + \ No newline at end of file diff --git a/app/app/src/main/res/values/strings-ar.xml b/app/app/src/main/res/values/strings-ar.xml index 3e3c7bc..4e88f72 100644 --- a/app/app/src/main/res/values/strings-ar.xml +++ b/app/app/src/main/res/values/strings-ar.xml @@ -12,4 +12,5 @@ انشاء حساب تاريخ الميلاد رقم ولي الأمر + بحث