【发布时间】: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