[我正在Food Ordering App上开发一个android项目,因为我创建了用于搜索食物的搜索视图,以便用户可以搜索食物,而主要问题是,当我在Search View Bur for Burger中键入任何内容时,不显示任何结果,因为它应该像在其他应用程序中一样仅在输入前2/3个字时显示,而我需要输入Burger的完整字,然后显示相同的字,但是当用户希望在搜索视图下方显示结果时输入相应食物的一些字词
package com.example.menulayout
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.SearchView
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.firestore.FirebaseFirestore
import java.lang.StringBuilder
import java.util.*
import kotlin.collections.ArrayList
class SearchFragment : Fragment() {
lateinit var recyclerView : RecyclerView
lateinit var searchView : SearchView
lateinit var foodAdapter : FoodAdapter
private val mArrayList: ArrayList<ModelFood> = ArrayList()
lateinit var arrayList : ArrayList<ModelFood>
private val fStore = FirebaseFirestore.getInstance()
private val fAuth = FirebaseAuth.getInstance()
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
// Inflate the layout for this fragment
val retview = inflater.inflate(R.layout.fragment_search, container, false)
return retview
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
searchView = view.findViewById(R.id.frag_search_view)
searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener{
override fun onQueryTextSubmit(p0: String?): Boolean {
return true
}
override fun onQueryTextChange(p0: String?): Boolean {
if(p0 == ""){
mArrayList.clear()
}
else {
searchFoodBreakfast(p0!!.split(' ').joinToString(" ") { it.capitalize() })
}
return true
}
})
recyclerView = view.findViewById(R.id.frag_search_recycler_view)
recyclerView.setHasFixedSize(true)
val layoutmanager = LinearLayoutManager(context)
recyclerView.layoutManager = layoutmanager
foodAdapter = FoodAdapter(activity!!.applicationContext, mArrayList)
recyclerView.adapter = foodAdapter
}
private fun searchFoodBreakfast(s: String) {
fStore.collection("HotBox Admin")
.document("F0y2F2SeaoWHjY7sIHFr4JRf1HF2")
.collection("Breakfast")
.whereEqualTo("foodname",s)
.addSnapshotListener { querySnapshot, firebaseFirestoreException ->
if (firebaseFirestoreException != null) {
Toast.makeText(context, "No Food Found", Toast.LENGTH_LONG).show()
}
for (i in querySnapshot!!) {
val foodsearch = ModelFood(
i.getString("imageuri")!!,
i.getString("foodname")!!,
i.getString("foodprice")!!,
i.getString("foodofferprice")!!,
i.getString("fooddescription")!!,
i.getString("foodcategory")!!
)
Log.d("key", i.getString("foodname").toString())
mArrayList.add(foodsearch)
}
foodAdapter.update(mArrayList)
}
}
override fun onStart() {
super.onStart()
(activity as AppCompatActivity).supportActionBar?.hide()
}
override fun onStop() {
super.onStop()
(activity as AppCompatActivity).supportActionBar?.show()
}
}
FoodAdapter.kt(适配器类)
package com.example.menulayout
import android.content.Context
import android.content.Intent
import android.content.SharedPreferences
import android.graphics.Bitmap
import android.util.Log
import android.view.Display
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.*
import androidx.cardview.widget.CardView
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.firestore.FieldValue
import com.google.firebase.firestore.FirebaseFirestore
import com.google.firebase.firestore.SetOptions
import java.io.Serializable
import java.util.*
import kotlin.collections.ArrayList
import kotlin.collections.HashMap
class FoodAdapter(var con: Context, var list: ArrayList<ModelFood>) : RecyclerView.Adapter<viewHolder>() {
private val userid = FirebaseAuth.getInstance().currentUser!!.uid.toString()
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): viewHolder {
val layoutInflater : LayoutInflater = LayoutInflater.from(con)
val v : View = layoutInflater.inflate(R.layout.layout_breakfast_rv, parent, false)
return viewHolder(v)
}
override fun getItemCount(): Int {
return list.size
}
fun update(list: ArrayList<ModelFood>) {
this.list = list
notifyDataSetChanged()
}
override fun onBindViewHolder(holder: viewHolder, position: Int) {
val foodItem = list[position]
Glide.with(con).load(foodItem.imageuri).centerCrop().dontAnimate().into(holder.ig_fd_image)
holder.tv_fd_name.text = foodItem.foodname
holder.tv_fd_price.text = foodItem.foodprice
holder.tv_fd_offprice.text = foodItem.foodofferprice
holder.parent_lay.setOnClickListener {
val intent = Intent(con, ProductDetailsActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
intent.putExtra("object",foodItem)
con.startActivity(intent)
}
holder.ig_fd_cart.setOnClickListener {
val intent = Intent(con, ProductDetailsActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
intent.putExtra("object",foodItem)
con.startActivity(intent)
}
holder.chk_add_fav.isChecked = foodItem.isLiked == 1
holder.chk_add_fav.setOnCheckedChangeListener { compoundButton, b ->
if(compoundButton.isPressed) {
if (b) {
val uuid = UUID.randomUUID().toString()
val favData = HashMap<String, Any>()
favData["foodcategory"] = foodItem.foodcategory
FirebaseFirestore.getInstance().collection("HotBox")
.document(userid)
.collection("Favorites")
.document(foodItem.foodid)
.set(favData, SetOptions.merge())
.addOnSuccessListener {
Toast.makeText(con, foodItem.foodname + " added to Favorites", Toast.LENGTH_LONG).show()
holder.chk_add_fav.isChecked = true
}
.addOnFailureListener { e ->
Toast.makeText(con, "Failed to Add", Toast.LENGTH_LONG).show()
Log.d("Main", e.toString())
}
}
else {
FirebaseFirestore.getInstance().collection("HotBox")
.document(userid)
.collection("Favorites")
.document(foodItem.foodid)
.delete()
.addOnSuccessListener {
Toast.makeText(con, foodItem.foodname + " removed from Favorites", Toast.LENGTH_LONG).show()
holder.chk_add_fav.isChecked = false
}
.addOnFailureListener {
Log.d("Main", it.message.toString())
Toast.makeText(con, foodItem.foodname + " failed to remove from Favorites", Toast.LENGTH_LONG).show()
}
}
}
}
}
}
class viewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
val parent_lay = itemView.findViewById<RelativeLayout>(R.id.parent_rel_lay)
val ig_fd_image = itemView.findViewById<ImageView>(R.id.food_image_inside_rv)
val chk_add_fav = itemView.findViewById<CheckBox>(R.id.favorites_add_to_fav)
val ig_fd_cart = itemView.findViewById<ImageView>(R.id.image_view_add_to_cart_inside_rv)
val tv_fd_name = itemView.findViewById<TextView>(R.id.txt_food_name_inside_rv)
val tv_fd_price = itemView.findViewById<TextView>(R.id.txt_food_price_inside_rv)
val tv_fd_offprice = itemView.findViewById<TextView>(R.id.txt_food_offer_price_inside_rv)
}
以上是我的代码,请帮助我,以便用户只需输入食物名称的前2/3个字母即可搜索食物先感谢您请帮我在那里!!! :):)
尝试一下
fStore.collection("HotBox Admin").collection("F0y2F2SeaoWHjY7sIHFr4JRf1HF2").collection("Breakfast");
foodRef.whereArrayContains("foodname", "yourQuery").get();