Сортировка в списке - PullRequest
       113

Сортировка в списке

0 голосов
/ 06 августа 2020

У меня есть список (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)
    }
}

Пожалуйста Помоги мне. Если вместо сортировки листов вы предлагаете другой подход для отображения определенных c элементов в RecyclerView. Я буду очень этому рад.

Ответы [ 2 ]

2 голосов
/ 07 августа 2020

Как мне перебрать все листы в mListCache и оставить только те, у которых есть имя: B.

Прямым ответом будет фильтрация значений внутри метода setList

fun setList(list: List<ExpationModel>) {
    mListCache = list.filter { it.name == "B" } 
    notifyDataSetChanged()
}

Другим решением может быть получение определенных c данных из базы данных вместо получения всех и последующей фильтрации.

1 голос
/ 07 августа 2020

Вы просите «фильтровать», а не «сортировать».

Фильтрация довольно проста в 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()
}

.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...