как передать несколько массивов разных типов в один адаптер - PullRequest
0 голосов
/ 15 мая 2019

Я пытаюсь использовать один RecyclerView.Adapter для просмотра нескольких Arraylists разных объектных моделей в нескольких фрагментах.Но я не знаю, как это сделать, есть ли способ сделать это и, если возможно, как я могу это сделать?

Я попытался использовать объект List и привести его к объектным моделям, которые я хотел.Но я не знаю, как использовать их в onBindViewHolder, я не знаю, является ли это даже правильным методом.

public RItemAdapter(List<?> item,String tag) {
        if(tag.equals("battery"))
        {
             bList = (List<BatteryModel>) item;
        }
        else if(tag.equals("device"))
        {
            dList = (List<DeviceModel>) item;
        }
        else if(tag.equals("network"))
        {
            nList = (List<NetworkModel>) item;
        }
        else if(tag.equals("storage"))
        {
            sList = (List<StorageModel>) item;
        }
        else if(tag.equals("weather"))
        {
            wList = (List<WeatherModel>) item;
    }

    }

Я хочу заполнить несколько RecyclerViews в нескольких Fragmentsодин адаптер.

1 Ответ

0 голосов
/ 15 мая 2019

Вы можете создать базовый класс, другой класс будет наследовать от него.Вы можете иметь список объектов, которые вы хотите в унаследованных классах: каждая ячейка будет содержать объект данных, который содержит список других вещей, которые вы хотите отобразить.Тогда в вашем адаптере у вас есть только один список вашего базового класса, и вы установите тип представления вашего объекта в позиции метода getItemViewType вашего адаптера.В onBindViewHolder просто переключите регистр на тип представления и свяжите правый ViewHolder с регистром.

Вот пример кода на Kotlin:

class TestAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
    companion object {
        private const val VIEW_TYPE_ONE = 0
        private const val VIEW_TYPE_TWO = 1
    }

    private val data = mutableListOf<Data>()

    override fun onCreateViewHolder(
        parent: ViewGroup,
        viewType: Int
    ): RecyclerView.ViewHolder = when (viewType) {
        VIEW_TYPE_ONE -> ViewHolderOne.create(parent)
        VIEW_TYPE_TWO -> ViewHolderTwo.create(parent)
        else -> throw IllegalStateException("Viewtype $viewType unhandled")
    }

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        when (holder) {
            is ViewHolderOne -> {
                holder.bind(data[position] as DataOne)
            }
            is ViewHolderTwo -> {
                holder.bind(data[position] as DataTwo)
            }
        }
    }

    override fun getItemViewType(position: Int): Int = when (data[position]) {
        is DataOne -> VIEW_TYPE_ONE
        is DataTwo -> VIEW_TYPE_TWO
    }

    override fun getItemCount(): Int = data.count()

    override fun getItemId(position: Int): Long = data[position].id

    fun setData(newData: List<MessageUiModel>) {
        data.clear()
        data.addAll(newData)
        notifyDataSetChanged()
    }
}

sealed class Data

data class DataOne(val list: List<Any>): Data()
data class DataTwo(val list: List<Any>): Data()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...