[英]Sorting in list
我有列表(mListCache)。 我用 Firebase 填充。 如何遍歷 mListCache 中的所有工作表並僅保留名稱為 B 的工作表。
我的適配器:
package ua.lujek.expiration_date.ui.fragment.Adapter
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.bumptech.glide.Glide
import kotlinx.android.synthetic.main.expation_item.view.*
import ua.lujek.expiration_date.R
import ua.lujek.expiration_date.models.ExpationModel
import ua.lujek.expiration_date.utilits.daysString
class ExpationAdatper : RecyclerView.Adapter<ExpationAdatper.ExpationHolder>() {
private var mListCache = emptyList<ExpationModel>()
private var mListSort = emptyList<ExpationModel>()
class ExpationHolder(view: View) : RecyclerView.ViewHolder(view) {
val name: TextView = view.expation_name
val volume: TextView = view.expation_volume
val count: TextView = view.count
val data_end: TextView = view.dataend
val lastday: TextView = view.lastday
val market: TextView = view.expation_market
val market_adress: TextView = view.expation_adress
val lastday_text: TextView = view.lastday_text
val count_text: TextView = view.count_text
val data_text: TextView = view.Date_text
val tt_text: TextView = view.expation_tt
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ExpationHolder {
val view = LayoutInflater.from(parent.context).inflate(R.layout.expation_item, parent, false)
return ExpationHolder(view)
}
override fun getItemCount(): Int = mListCache.size
override fun onBindViewHolder(holder: ExpationHolder, position: Int)
{
holder.name.text = mListCache[position].name
holder.volume.text = mListCache[position].bottlevolume
holder.count.text = mListCache[position].count
holder.data_end.text = mListCache[position].dataend
holder.lastday.text = daysString(mListCache[position].dataend)
holder.market.text = mListCache[position].market
holder.market_adress.text = mListCache[position].marketadress
holder.data_text.text = mListCache[position].data_text
holder.lastday_text.text = "Осталось дней:"
holder.count_text.text = "Количество:"
holder.tt_text.text = "Торговая точка:"
Glide.with(holder.itemView.context)
.load(mListCache[position].photo_Url)
.error(R.drawable.ic_item_photo)
.placeholder(R.drawable.ic_item_photo)
.into(holder.itemView.photo_item)
}
fun setList(list: List<ExpationModel>) {
mListCache = list
notifyDataSetChanged()
}
}
我的片段:
package ua.lujek.expiration_date.ui.fragment
import android.view.View
import android.widget.AdapterView
import android.widget.AdapterView.OnItemSelectedListener
import android.widget.ArrayAdapter
import androidx.recyclerview.widget.RecyclerView
import com.google.firebase.database.DatabaseReference
import kotlinx.android.synthetic.main.fragment_main.*
import ua.lujek.expiration_date.DB.*
import ua.lujek.expiration_date.R
import ua.lujek.expiration_date.models.ExpationModel
import ua.lujek.expiration_date.ui.fragment.Adapter.ExpationAdatper
import ua.lujek.expiration_date.utilits.*
class MainFragment : BaseFragment(R.layout.fragment_main) {
private lateinit var mRecycleView:RecyclerView
private lateinit var mRefExpation: DatabaseReference
private lateinit var mAdapter:ExpationAdatper
private lateinit var mExpationListener: AppValueEventListener
private var mListExpation = emptyList<ExpationModel>()
private val merchName: MutableList<String> = ArrayList()
private val nameAdapter = ArrayAdapter<String>(APP_ACTIVITY, android.R.layout.simple_spinner_item, merchName)
override fun onResume() {
super.onResume()
APP_ACTIVITY.title = "Товары"
AddButtonNewProduct.setOnClickListener {
APP_ACTIVITY.supportFragmentManager.beginTransaction()
.replace(R.id.Fragment_container, NewProductFragment()).commit()
}
DownloadName()
initRecycleView()
}
fun DownloadName() {
REF_DATABASE_ROOT.child(NODE_EXPATION).child(USER.company).child(USER.region)
.addValueEventListener(AppValueEventListener {
for (nameSnapshot in it.children) {
val areaName = nameSnapshot.child("merchName").getValue(String::class.java)!!
merchName.add(areaName)
val set: Set<String> = HashSet(merchName)
merchName.clear()
merchName.addAll(set)
}
merchName.add(0, "Все мерчендайзеры")
nameAdapter.setDropDownViewResource(android.R.layout.simple_spinner_item)
etmerchName.adapter = nameAdapter
})
etmerchName.onItemSelectedListener = object : OnItemSelectedListener {
override fun onNothingSelected(p0: AdapterView<*>?) { }
override fun onItemSelected(adapterView: AdapterView<*>?, view: View, position: Int, l: Long) {
REQUEST_SPINNER = etmerchName.getItemAtPosition(position).toString()
}
}
}
private fun initRecycleView() {
mRecycleView = expation_recycle_view
mAdapter = ExpationAdatper()
mRefExpation = REF_DATABASE_ROOT.child(NODE_EXPATION).child(USER.company).child(USER.region)
mRecycleView.adapter = mAdapter
mExpationListener = AppValueEventListener { dataSnapshot ->
mListExpation = dataSnapshot.children.map { it.getExpationModel() }
mAdapter.setList(mListExpation)
}
mRefExpation.addValueEventListener(mExpationListener)
}
override fun onPause() {
super.onPause()
mRefExpation.removeEventListener(mExpationListener)
}
}
請幫我。 如果不是對工作表進行排序,您建議使用不同的方法在 RecyclerView 中顯示特定項目。 我會很高興的。
如何遍歷 mListCache 中的所有工作表並僅保留名稱為 B 的工作表。
直接的答案是過濾setList
方法中的值
fun setList(list: List<ExpationModel>) {
mListCache = list.filter { it.name == "B" }
notifyDataSetChanged()
}
其他解決方案是從數據庫中檢索特定數據,而不是獲取所有數據然后過濾。
您要求的是“過濾”而不是“排序”。
在 Kotlin 中過濾非常容易。
val newlist = list.filter{ it.name.startsWith("B") }
排序也很簡單:
val newList = list.sortedBy{ it.name }
兩種方法都返回一個新列表,舊列表沒有被修改。 更棘手的部分是在哪里調用過濾器方法。 我不確定,我會在這里嘗試:
fun setList(list: List<ExpationModel>) {
mListCache = list.filter{ it.name.startsWith("B") }
notifyDataSetChanged()
}
.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.