#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