如何将不同类型的多个arraylist传递到单个recyclerview适配器

时间:2019-05-15 04:49:27

标签: android android-recyclerview recycler-adapter

我正在尝试使用单个RecyclerView.Adapter来查看多个片段中不同对象模型的多个Arraylist。 但是我不知道该怎么办,有没有办法做,如果可能的话我该怎么办?

我尝试使用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

2 个答案:

答案 0 :(得分:0)

您可以创建一个基类,其他类将从其继承。您可以在继承的类中具有所需对象的列表:每个单元格将包含一个数据对象,该数据对象包含要显示的其他内容的列表。 然后,在适配器中,只有一个基类列表,并且将在适配器的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()

答案 1 :(得分:0)

我找到了best个答案。可能会帮助别人。

private static void doProspecListCompareCheck(List rhsList)
{
    if(rhsList != null && !rhsList.isEmpty())
    {
        if (rhsList.get(0) instanceof SegReqInfoBean)
        {

        }
        else if(rhsList.get(0) instanceof SegmentDetailInfo)    
        {

        }
    }
}