在片段中使用 onQueryTextChange 并需要一些关于代码的建议

using onQueryTextChange in fragment and need some suggestions regarding code

实际上,我想使用 Kotlin 在片段中添加 SearchView,但没有人告诉我该怎么做,所以我尝试使用在 Activity.They 中创建 Searchview 的 YouTuber 使用的代码在 ForEach 之后使用的代码循环,那就是 if(it.lowercase(Locale.getDefault().contains(text).

因此,当我添加此行时,编译器抛出了未解决引用的错误,接收器类型不匹配...所以我只想知道我应该添加哪一行而不是此行(如果我不使用此行,则什么也不添加)我的临时数组)

谢谢

这是我的代码:

...

数据海class的密码

class数据海(

var book_id : String,

val name : String,

val author: String,

val price: String,

val rating : String,

var image: String

    )

仪表板片段

class 仪表板:片段(){

lateinit var recyclerView: RecyclerView // recycler view

lateinit var relativeLayout: RelativeLayout

lateinit var ada: adapter  //adapter class object

lateinit var values: DataHai

lateinit var swipe: SwipeRefreshLayout

lateinit var LayoutManager: LinearLayoutManager

lateinit var value: ArrayList<DataHai>

lateinit var temp :ArrayList<DataHai>

override fun onCreateView(

    inflater: LayoutInflater, container: ViewGroup?,

savedInstanceState:捆绑?

): View? {

    var view = inflater.inflate(R.layout.fragment_dashboard,

容器,假)

    value = ArrayList()

    temp= ArrayList()

    setHasOptionsMenu(true)

    swipe = view.findViewById(R.id.swipe)

    relativeLayout = view.findViewById(R.id.progresslaoout)

    recyclerView = view.findViewById(R.id.recycler)

    LayoutManager = LinearLayoutManager(activity)

    gettingData()

    swipe.setOnRefreshListener {

        gettingData()

    }

    relativeLayout.visibility = View.VISIBLE

    val que = Volley.newRequestQueue(activity as Context)

    var url = "http://13.235.250.119/v1/book/fetch_books/"


    var jsonObjectRequest =

object : JsonObjectRequest(Method.GET, url, null, 

Response.Listener {

            try {

                relativeLayout.visibility = View.GONE

                var success = it.getBoolean("success")

                if (success) {

                    var data = it.getJSONArray("data")

                    for (i in 0 until data.length()) 

                    {

                        var jsonobject = data.getJSONObject(i)

                        values = DataHai(

// jsonobject.getString("book_id"),

                            jsonobject.getString("name"),

                            jsonobject.getString("author"),

                            jsonobject.getString("price"),

                            jsonobject.getString("rating"),

                            jsonobject.getString("image")


                        )


                        value.add(values)

//现在将数据添加到Datahai的值数组中class

                    }

temp.addAll(值)

                } else {

makeText(context, "发生错误", Toast.LENGTH_SHORT).show()

                }

// /* 说上下文 == null*/

                ada = adapter(activity as Context, temp)

    /*now giving activity as context

           and adding value array that will access by adapter

class数组*/

                recyclerView.adapter = ada 

     /* connecting these classes  */

recyclerView.layoutManager = 布局管理器

            } catch (e: JSONException) {

makeText(context, "some error occured", 

Toast.LENGTH_SHORT).show()

            }

        }, Response.ErrorListener {


            makeText(context, "some error occured", 

Toast.LENGTH_SHORT).show()

        }) {

            override fun getHeaders(): MutableMap<String, 

字符串> {

                val header = HashMap<String, String>()

                header.put("value-type", "application/json")

                header.put("token", " 9bf534118365f1")

                return header


            }

        }
    que.add(jsonObjectRequest)

    return view
}

fun gettingData() {

    if (Connection().ConnectionChecking(activity as Context)) {

    } else {

        var build = AlertDialog.Builder(activity as Context)

        build.setTitle("Not Connected")

        build.setMessage("please check your internet 

连接")

        build.setPositiveButton("try again") { text, listner ->

            startActivityForResult(Intent(Settings.ACTION_WIRELESS_SETTINGS), 0)

        }

        build.setNegativeButton("cancel") { text, listner ->

        }

        build.create()

        build.show()
    }


    swipe.isRefreshing = false

}

override fun onCreateOptionsMenu(menu: Menu, inflater: 

MenuInflater) {

    inflater.inflate(R.menu.icon,menu)

    var item=menu.findItem(R.id.search)

    var search=item?.actionView as SearchView

    super.onCreateOptionsMenu(menu, inflater)


    search.setOnQueryTextListener(object:SearchView.OnQueryTextListener{


        override fun onQueryTextSubmit(p0: String?): Boolean {

          return true
        }

     
        override fun onQueryTextChange(p0: String?): Boolean {

            temp.clear()

            var text=p0?.lowercase(Locale.getDefault())

            if (text!!.isNotEmpty()) {

makeText(activity as Context, "working", 

Toast.LENGTH_LONG).show()

                value.forEach {

                    temp.add(it) //by this line data should add 

但未添加

                }


            }

            else {

                temp.clear()

                temp.addAll(value)

            }

            recyclerView.adapter?.notifyDataSetChanged()

            return true
        }

    })

}

}

适配器

class 适配器(var 上下文:上下文,var ada:ArrayList) : 适配器() {

/*array*/


override fun onCreateViewHolder(parent: ViewGroup, viewType:

Int): viewholderclass {

    var view= 

LayoutInflater.from(parent.context).inflate(R.layout.adapter,parent

,假)

    return viewholderclass(view)

}

override fun onBindViewHolder(holder: viewholderclass, 

位置:整数){

    var id=ada[position]

    var auth=ada[position]  

                /*  now i am parsing the data from the ada array */

    holder.author.text=auth.author

    var nam=ada[position]

    holder.year.text=nam.name

    var rate=ada[position]

    holder.rating.text=rate.rating

    var pri=ada[position]

    holder.price.text=pri.price



    Picasso.get().load(id.image).into(holder.image)



}

override fun getItemCount() :Int{

    return ada.size             /* returning the size  */

}


class viewholderclass(view: View) : 

RecyclerView.ViewHolder(查看){

    var year=view.findViewById<TextView>(R.id.name)

    var author=view.findViewById<TextView>(R.id.author)

    var rating=view.findViewById<TextView>(R.id.rating)

    var price=view.findViewById<TextView>(R.id.price)

    var image=view.findViewById<ImageView>(R.id.image)

    var layout =view.findViewById<RelativeLayout>(R.id.adapter)

}

}

...

来自你问题中的原始代码:

value.forEach {        
    if(it.lowercase(Locale.getDefault()).contains(searchtext)) { 
        temp.add(it)
    }
}

由于valueDatahai的列表,那么在lambda里面,it是一个Datahai,不是String,所以不能调用lowercase在上面。你在评论中说你只想搜索 name 属性,所以你只需要获取 name 并比较它:

value.forEach {        
    if(it.name.lowercase(Locale.getDefault()).contains(searchtext)) { 
        temp.add(it)
    }
}

如果使用 filterTo 而不是 forEach,您的代码会更简单一些:

value.filterTo(temp) {        
    it.name.lowercase(Locale.getDefault()).contains(searchtext))
}