實際上我想使用 Kotlin 在片段中添加 SearchView,但沒有人告訴如何做到這一點,所以我試圖使用 YouTuber 在 Activity 中創建 Searchview 使用的代碼。他們在 ForEach 回圈之后使用了一個代碼,那就是如果(它.lowercase(Locale.getDefault().contains(text)。
所以當我添加這個 Line compiler Throwed Error that Unresolved Reference ,receiver type mismatch ...所以我只想知道我應該添加哪一行而不是這個(如果我不使用這一行,那么我的臨時陣列中沒有任何添加)
謝謝
這是我的代碼:
...
Datahai類的代碼
類資料海(
var book_id : String,
val name : String,
val author: String,
val price: String,
val rating : String,
var image: String
)
儀表板片段
類儀表板:片段(){
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 類的值陣列中
}
temp.addAll(值)
} else {
makeText(context, "some error occured", Toast.LENGTH_SHORT).show()
}
// /* saying context == null*/
ada = adapter(activity as Context, temp)
/*now giving activity as context
and adding value array that will access by adapter
class array*/
recyclerView.adapter = ada
/* connecting these classes */
recyclerView.layoutManager = 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,
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
Connection")
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
but not added
}
}
else {
temp.clear()
temp.addAll(value)
}
recyclerView.adapter?.notifyDataSetChanged()
return true
}
})
}
}
adapter
class adapter(var context : Context, var ada : ArrayList) : Adapter<adapter.viewholderclass>() {
/*array*/
override fun onCreateViewHolder(parent: ViewGroup, viewType:
Int): viewholderclass {
var view=
LayoutInflater.from(parent.context).inflate(R.layout.adapter,parent
,false)
return viewholderclass(view)
}
override fun onBindViewHolder(holder: viewholderclass,
position: Int) {
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(view) {
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)
}
}
...
uj5u.com熱心網友回復:
從您問題中的原始代碼:
value.forEach {
if(it.lowercase(Locale.getDefault()).contains(searchtext)) {
temp.add(it)
}
}
既然value是 的串列Datahai,那么在 lambda 中,it是一個 Datahai,而不是一個字串,所以你不能呼叫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))
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/415019.html
標籤:
