У меня есть небольшое приложение android, которое состоит из списка перевозчиков, каждый перевозчик может иметь список принадлежащих им грузовиков. Мне нужно реализовать фильтр (этот фильтр можно настроить по тому параметру, по которому вы хотите фильтровать).
Когда пользователь выбирает фильтрацию данных, относящихся к списку грузовиков (вложенный список), он фильтрует правильно, но когда Вы удаляете дату, она не будет обновлять оригинальный список грузовиков. Я предполагаю, что эта проблема возникает, потому что мне нужно глубоко копировать каждый элемент в списке перевозчиков. У меня есть два списка (исходный и отфильтрованный)
Вот как я их определил:
private lateinit var originalHaulerData : ArrayList<HaulerData>
private lateinit var filteredHaulerData : List<HaulerData>
при редактировании фильтра я восстанавливаю данные из исходных данных и фильтрую данные новым фильтром.
Это моя функция filterData
fun filterData(){
//this is where I'm doing the copy from the original list to the filtered
filteredHaulerData = ArrayList(originalHaulerData)
for(hIndex in originalHaulerData.indices){
val filteredHauler = originalHaulerData[hIndex].copy()
if(originalHaulerData[hIndex].truckList!=null){
for (tIndex in originalHaulerData[hIndex].truckList!!.toMutableList().indices)
{
val truck = originalHaulerData[hIndex].truckList!!.toMutableList()[tIndex].copy()
filteredHauler.truckList!!.toMutableList().add(tIndex,truck)
}
}
filteredHaulerData.toMutableList().add(hIndex,filteredHauler)
}
filteredHaulerData = filteredHaulerData.filter { hauler->
var trucksFiltered = false
if(!hauler.truckList.isNullOrEmpty()) {
val filteredTrucks = hauler.truckList!!.filter { truck ->
(haulerFilterObj.haulerDate==null || (haulerFilterObj.haulerDate!=null && truck.timestamp!=null && truck.timestamp!!.startsWith(haulerFilterObj.haulerDate!!))) &&
(haulerFilterObj.haulerTruck==null || (haulerFilterObj.haulerTruck!=null && truck.trackName!=null && truck.trackName!!.startsWith(haulerFilterObj.haulerTruck!!)))
}
hauler.truckList = filteredTrucks
trucksFiltered = hauler.truckList!!.isNotEmpty()
}else{
trucksFiltered = false
}
(haulerFilterObj.haulerDate==null || trucksFiltered) &&
(haulerFilterObj.haulerName==null || (haulerFilterObj.haulerName!=null && hauler.name!!.toLowerCase(Locale.US).startsWith(haulerFilterObj.haulerName!!.toLowerCase(Locale.US)))) &&
(haulerFilterObj.haulerLocation==null || (haulerFilterObj.haulerLocation!=null && hauler.address!=null && hauler.address.toLowerCase(Locale.US).contains(haulerFilterObj.haulerLocation!!.toLowerCase(Locale.US))))
}
noHaulersHolder.visibility = if(filteredHaulerData.isEmpty()) View.VISIBLE else View.GONE
haulerRecyclerView.visibility = if(filteredHaulerData.isEmpty()) View.GONE else View.VISIBLE
haulerAdapter.setData(filteredHaulerData)
mapHaulersAdapter.setData(filteredHaulerData)
}