Можно ли показать Recyclerview из двух списков разных типов? - PullRequest
1 голос
/ 07 февраля 2020

Android Studio 3.6

Для отображения списка на экране (Упражнение) я использую androidx.recyclerview.widget.RecyclerView и androidx.recyclerview.widget.RecyclerView.

Отлично, все отлично работает.

Но сейчас Мне нужно показать два разных списков (разных типов предметов) на одном экране. И прокрутите эти оба списка как один список. Элементы этих двух списков будут перепутаны. Должны быть отсортированы по дате . Например:

list1.item1_type1
list2.item1_type2
list2.item2_type2
list1.item2_type1
list1.item3_type1
list1.item4_type1
list1.item5_type1
list2.item3_type2

Можно ли показать ДВА списка в одном RecyclerView?

Ответы [ 2 ]

1 голос
/ 07 февраля 2020

Наша задача - отсортировать списки по дате, но проблема в том, что они бывают разных типов. Поэтому нам нужно исправить это с помощью другого типа / класса, который будет иметь данные обоих классов. Тогда мы сможем отсортировать наш новый список комбинированного типа.

Давайте сначала воссоздаем проблему: предположим, у нас есть два типа:

data class DataType1(var title: String, var date: Date)
data class DataType2(var title: String, var date: Date, var someOther: String)

val list1 = mutableListOf <DataType1> ()
val list2 = mutableListOf <DataType2> ()

list1.add(DataType1("Data 1", Date("01/01/2012")))
list1.add(DataType1("Data 2", Date("01/01/2013")))
list1.add(DataType1("Data 3", Date("01/01/2014")))

list2.add(DataType2("Data 21", Date("01/01/2022"), "Other"))
list2.add(DataType2("Data 22", Date("01/01/2010"), "Other"))
list2.add(DataType2("Data 23", Date("01/01/2005"), "Other"))

На этом этапе мы представим новый тип, который здесь FixTypes.

class FixTypes(private val data1: DataType1?, private val data2: DataType2?) {

    lateinit var date: Date
    lateinit var title: String
    var someOther: String? = null // those are not common field can be null

    init {
        if (data1 != null) {
            date = this.data1.date
            title = this.data1.title
        } else if (data2 != null) {
            date = this.data2.date
            title = this.data2.title
            someOther = this.data2.someOther
        }
    }
}

Затем создайте новый список:

val fixedList = mutableListOf<FixTypes>()

list1.forEach {
    val ft = FixTypes(it, null)
    fixedList.add(ft)
}

list2.forEach {
    val ft = FixTypes(null, it)
    fixedList.add(ft)
}

Поскольку мы скопировали данные обоих списков в NewType, мы отсортируем их:

fixedList.sortByDescending { it.date }

fixedList.forEach {
    Log.d("TAG", it.date.toString())
}

Наш отсортированный список:

Sat Jan 01 00:00:00 GMT+06:00 2022
Wed Jan 01 00:00:00 GMT+06:00 2014
Tue Jan 01 00:00:00 GMT+06:00 2013
Sun Jan 01 00:00:00 GMT+06:00 2012
Fri Jan 01 00:00:00 GMT+06:00 2010
Sat Jan 01 00:00:00 GMT+06:00 2005

Теперь мы изменим тип списка источников Adapter на наш вновь созданный тип. Это все.

Еще одна вещь, которую стоит упомянуть: два recycler вида не будут работать , потому что как вы будете смешивать предметы?

1 голос
/ 07 февраля 2020

Как заметил Элиас выше, оберните два RecyclerViews в NestedScrollView.

Настройте и внедрите 2 различных RecyclerView. В макете XML они расположены один над другим, но внутри NestedScrollView. Эффект будет иметь оба списка друг над другом, прокручиваясь как один.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...