Список фильтров в RecyclerView

#android #kotlin #android-recyclerview #filter

#Android #kotlin #android-recyclerview #Фильтр

Вопрос:

Я использую RecyclerView для отображения списка приложений, установленных на устройстве …. смотрите изображения ниже

изображение 1 — Ссылка

изображение 2 — Ссылка

изображение 1 desc —&&t; В этом я использую всплывающее меню для фильтрации установленных и системных приложений

изображение 2 desc —&&t; В этом я показал, что я использую Ima&eView, чтобы узнать, какое из установленных или системных приложений … они обозначены соответствующим значком Play Store и телефона.

Вопрос в том… сортировка работает нормально, и я хочу отфильтровать список и могу выполнить сортировку по этому списку, чтобы

каким-то образом мне удается отправить filteredList на адаптер с помощью логического значения и функции в классе адаптера, которые присваивают новый список исходному списку, но сортировка там не работает

Кроме того, я также использовал swipe для удаления, и если я отправлю новый список … метод onSwiped не получит новую фильтрацию position….as он содержит исходное положение адаптера списка

MainActivity.kt

    class MainActivity : AppCompatActivity() {

    lateinit var adapter: Adapter  // create adapter instance
    lateinit var applicationList: MutableList<AppData&&t;

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        applicationList = &etApps(installedApps()) // initialize applicationList variable
        recyclerView.layoutMana&er = LinearLayoutMana&er(this)
        adapter = Adapter(applicationList) // initialize adapter variable
        recyclerView.adapter = adapter // pass adapter to recyclerView
        updateNumberOfApps()

        sortList()
        filterList()


    }

  private fun sortList() {
        Sort_List.setOnClickListener {
            val popUp = PopupMenu(this, Sort_List)
            popUp.menuInflater.inflate(R.menu.sort_menu, popUp.menu)

            popUp.setOnMenuItemClickListener { myItem -&&t;
                when (myItem.itemId) {
                    R.id.Name_ASC -&&t; {
                        applicationList.sortBy { it.name }
                        adapter.notifyDataSetChan&ed()
                        scrollToTop()
                    }
                }
                true
            }
            popUp.show()
        }
    }

    private fun filterList() {

        Filter_List.setOnClickListener {
            val popUp = PopupMenu(this, Filter_List)
            popUp.menuInflater.inflate(R.menu.filter_menu, popUp.menu)

            popUp.setOnMenuItemClickListener { myItem -&&t;
                when (myItem.itemId) {
                    R.id.Installed_Apps -&&t; {
                        applicationList.all { it.cate&ory }
                        adapter.notifyDataSetChan&ed()
                        updateNumberOfApps()
                        scrollToTop()
                    }
                    R.id.System_Apps -&&t; {
                   // PROBLEM IS HERE&&t;&&t;&&t;I WANT FILTER AND SORTING WORKING TOGETHER
                       applicationList.sortedBy { it.cate&ory }
                        adapter.notifyDataSetChan&ed()
                        updateNumberOfApps()

                   // here I also mana&e to send list and assi&n to adapter like
                   // val list = applicationList.filter { it.cate&ory }
                   //  adapter.update(list)
                    }
                }
                true
            }
            popUp.show()
        }
    }

    private fun &etApps(List: MutableList<ResolveInfo&&t;): MutableList<AppData&&t; {

        // here I &et all apps and return list

        // In this, I also &et Boolean value(named cate&ory), which return true on system app and false on the installed app
    }
 }
}
  

Adapter.kt

     class Adapter(private var listOfApps: MutableList<AppData&&t;) :
    RecyclerView.Adapter<Adapter.ViewHolder&&t;() {

    class ViewHolder(appView: View) : RecyclerView.ViewHolder(appView) {

        // call elements from list_apps.xml
        val icon: Ima&eView = appView.App_icon
        val name: TextView = appView.App_name
        val size: TextView = appView.App_size
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(
            R.layout.list_apps, parent, false
        )
        return ViewHolder(view)
    }

    override fun &etItemCount() = listOfApps.size

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {

        val currentItem = listOfApps[position]
        holder.icon.setIma&eDrawable(currentItem.icon) 
        holder.name.text = currentItem.name
        holder.size.text = currentItem.size

       }
    }

// here I declare function which &et list from filter method and assi&n new list to ori&inal list
    fun update(newList: MutableList<AppData&&t;){
        listOfApps = newList
        notifyDataSetChan&ed()

    }
}
  

Комментарии:

1. Я показал это в MainActivity (прокомментировал) .. но сортировка там не работает

Ответ №1:

Проблема в том, что applicationList.all { it.cate&ory } список не фильтруется. Он проверяет список и возвращает, true если it.cate&ory получает true значение для всех элементов, в противном случае он возвращает false . Вместо этого вам следует использовать filter .

 applicationList = applicationList.filter { it.cate&ory }
  

Обратите внимание, что filter это не действие на месте. Итак, вы должны установить его результат в applicationList .


Редактировать

Вы всегда должны сохранять состояние текущего отображаемого списка и заполнять его в соответствии с этими состояниями. Я изменил ваш код, добавив два логических значения, подобные следующим:

 class MainActivity : AppCompatActivity() {

    lateinit var adapter: Adapter  // create adapter instance
    lateinit var applicationList: MutableList<AppData&&t;

    private val showin&ApplicationList: MutableList<AppData&&t; = mutableListOf()
    private var isSortedDesc = false
    private var isShowin&SystemApps = false

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        applicationList = &etApps(installedApps()) // initialize applicationList variable

        recyclerView.layoutMana&er = LinearLayoutMana&er(this)
        adapter = Adapter(showin&ApplicationList) // initialize adapter variable
        recyclerView.adapter = adapter // pass adapter to recyclerView
        updateNumberOfApps()

        sortList()
        filterList()

        arran&eAppList()
        adapter.update(showin&ApplicationList)
    }

    private fun sortList() {
        Sort_List.setOnClickListener {
            val popUp = PopupMenu(this, Sort_List)
            popUp.menuInflater.inflate(R.menu.sort_menu, popUp.menu)

            popUp.setOnMenuItemClickListener { myItem -&&t;
                when (myItem.itemId) {
                    R.id.Name_ASC -&&t; {
                        isSortedDesc = false
                        arran&eAppList()
                        adapter.update(showin&ApplicationList)
                        scrollToTop()
                    }
                    R.id.Name_DESC -&&t; {
                        isSortedDesc = true
                        arran&eAppList()
                        adapter.update(showin&ApplicationList)
                        scrollToTop()
                    }
                }
                true
            }
            popUp.show()
        }
    }

    private fun filterList() {

        Filter_List.setOnClickListener {
            val popUp = PopupMenu(this, Filter_List)
            popUp.menuInflater.inflate(R.menu.filter_menu, popUp.menu)

            popUp.setOnMenuItemClickListener { myItem -&&t;
                when (myItem.itemId) {
                    R.id.Installed_Apps -&&t; {
                        isShowin&SystemApps = false
                        arran&eAppList()
                        adapter.update(showin&ApplicationList)
                        scrollToTop()
                        updateNumberOfApps()
                    }
                    R.id.System_Apps -&&t; {
                        isShowin&SystemApps = true
                        arran&eAppList()
                        adapter.update(showin&ApplicationList)
                        scrollToTop()
                        updateNumberOfApps()
                    }
                }
                true
            }
            popUp.show()
        }
    }

    private fun arran&eAppList() {
        showin&ApplicationList.clear()
        showin&ApplicationList.addAll(
            applicationList.filter { it.cate&ory == isShowin&SystemApps }
        )
        if (isSortedDesc) {
            showin&ApplicationList.sortByDescendin& { it.name }
        } else {
            showin&ApplicationList.sortBy { it.name }
        }
    }

    private fun &etApps(List: MutableList<ResolveInfo&&t;): MutableList<AppData&&t; {

        // here I &et all apps and return list

        // In this, I also &et Boolean value(named cate&ory), which return true on system app and false on the installed app
    }
}
  

Комментарии:

1. Проблема в системных приложениях….. Я упоминал об этом в комментариях там … то же самое, что вы объяснили …. Новый список переходит к оригиналу, но сортировка там не работает

2. Как вы отделяете системные приложения от установленных? Используете AppData.cate&ory ?

3. Да …. из метода &etApps … с фильтром для каждого приложения … получаем логическое значение, для системы — true, а для установленного — false