【问题标题】:Filter List in recyclerViewrecyclerView中的过滤列表
【发布时间】:2020-12-02 05:14:07
【问题描述】:

我正在使用 recyclerView 显示设备中安装的应用程序列表 ....见下图

图片 1 - Link

图片 2 - Link

image 1 desc --> 在此,我使用弹出菜单过滤已安装和系统应用程序

image 2 desc --> 在此,我展示了,我使用 imageView 来找出已安装或系统应用程序...这些分别由 play store 和电话图标指示。

问题是 ...排序工作正常,我想过滤列表并可以对该列表进行排序

我设法在适配器类中的布尔值和函数的帮助下将过滤列表发送到适配器,它将新列表分配给原始列表,但排序在那里不起作用

此外,我还使用滑动删除,如果我发送新列表...onSwiped 方法不会获得新的过滤位置....因为它保留原始列表适配器位置

MainActivity.kt

   class MainActivity : AppCompatActivity() {

    lateinit var adapter: Adapter  // create adapter instance
    lateinit var applicationList: MutableList<AppData>

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

        applicationList = getApps(installedApps()) // initialize applicationList variable
        recyclerView.layoutManager = LinearLayoutManager(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 ->
                when (myItem.itemId) {
                    R.id.Name_ASC -> {
                        applicationList.sortBy { it.name }
                        adapter.notifyDataSetChanged()
                        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 ->
                when (myItem.itemId) {
                    R.id.Installed_Apps -> {
                        applicationList.all { it.category }
                        adapter.notifyDataSetChanged()
                        updateNumberOfApps()
                        scrollToTop()
                    }
                    R.id.System_Apps -> {
                   // PROBLEM IS HERE>>>I WANT FILTER AND SORTING WORKING TOGETHER
                       applicationList.sortedBy { it.category }
                        adapter.notifyDataSetChanged()
                        updateNumberOfApps()

                   // here I also manage to send list and assign to adapter like
                   // val list = applicationList.filter { it.category }
                   //  adapter.update(list)
                    }
                }
                true
            }
            popUp.show()
        }
    }

    private fun getApps(List: MutableList<ResolveInfo>): MutableList<AppData> {

        // here I get all apps and return list

        // In this, I also get Boolean value(named category), which return true on system app and false on the installed app
    }
 }
}

Adapter.kt

    class Adapter(private var listOfApps: MutableList<AppData>) :
    RecyclerView.Adapter<Adapter.ViewHolder>() {

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

        // call elements from list_apps.xml
        val icon: ImageView = 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 getItemCount() = listOfApps.size

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

        val currentItem = listOfApps[position]
        holder.icon.setImageDrawable(currentItem.icon) 
        holder.name.text = currentItem.name
        holder.size.text = currentItem.size

       }
    }

// here I declare function which get list from filter method and assign new list to original list
    fun update(newList: MutableList<AppData>){
        listOfApps = newList
        notifyDataSetChanged()

    }
}

【问题讨论】:

  • 我在 mainActivity 中展示了这一点(已评论)..但排序在那里不起作用

标签: android kotlin android-recyclerview filter


【解决方案1】:

问题是applicationList.all { it.category } 没有过滤列表。它检查列表并返回true,如果it.category 为所有项目获得true,否则返回false。你应该改用filter

applicationList = applicationList.filter { it.category }

请注意,filter 不是就地操作。因此,您应该将其结果设置为applicationList


编辑

您应该始终保持当前显示列表的状态并根据这些状态填充它。我通过添加两个布尔值来更改您的代码,如下所示:

class MainActivity : AppCompatActivity() {

    lateinit var adapter: Adapter  // create adapter instance
    lateinit var applicationList: MutableList<AppData>

    private val showingApplicationList: MutableList<AppData> = mutableListOf()
    private var isSortedDesc = false
    private var isShowingSystemApps = false

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

        applicationList = getApps(installedApps()) // initialize applicationList variable

        recyclerView.layoutManager = LinearLayoutManager(this)
        adapter = Adapter(showingApplicationList) // initialize adapter variable
        recyclerView.adapter = adapter // pass adapter to recyclerView
        updateNumberOfApps()

        sortList()
        filterList()

        arrangeAppList()
        adapter.update(showingApplicationList)
    }

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

            popUp.setOnMenuItemClickListener { myItem ->
                when (myItem.itemId) {
                    R.id.Name_ASC -> {
                        isSortedDesc = false
                        arrangeAppList()
                        adapter.update(showingApplicationList)
                        scrollToTop()
                    }
                    R.id.Name_DESC -> {
                        isSortedDesc = true
                        arrangeAppList()
                        adapter.update(showingApplicationList)
                        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 ->
                when (myItem.itemId) {
                    R.id.Installed_Apps -> {
                        isShowingSystemApps = false
                        arrangeAppList()
                        adapter.update(showingApplicationList)
                        scrollToTop()
                        updateNumberOfApps()
                    }
                    R.id.System_Apps -> {
                        isShowingSystemApps = true
                        arrangeAppList()
                        adapter.update(showingApplicationList)
                        scrollToTop()
                        updateNumberOfApps()
                    }
                }
                true
            }
            popUp.show()
        }
    }

    private fun arrangeAppList() {
        showingApplicationList.clear()
        showingApplicationList.addAll(
            applicationList.filter { it.category == isShowingSystemApps }
        )
        if (isSortedDesc) {
            showingApplicationList.sortByDescending { it.name }
        } else {
            showingApplicationList.sortBy { it.name }
        }
    }

    private fun getApps(List: MutableList<ResolveInfo>): MutableList<AppData> {

        // here I get all apps and return list

        // In this, I also get Boolean value(named category), which return true on system app and false on the installed app
    }
}

【讨论】:

  • 问题出在系统应用程序中.....我在 cmets 中提到过......和你解释的一样......newList 是原始的,但排序在那里不起作用
  • 如何将系统应用与已安装应用分开?使用AppData.category ?
  • 是 ....来自 getApps 方法 ...在每个应用程序上使用过滤器...获取布尔值,系统为真,安装为假
猜你喜欢
  • 2018-02-12
  • 2021-11-18
  • 1970-01-01
  • 1970-01-01
  • 2018-09-06
  • 2021-12-03
  • 2020-12-26
  • 1970-01-01
  • 2023-04-05
相关资源
最近更新 更多