为什么我的子模型无法转换为java.util.ArrayList

时间:2019-10-19 01:22:57

标签: kotlin recycler-adapter

我正在使用多级数据进行recyclerview,将数据输入到子适配器中时出现问题。出现错误,例如“无法将模型强制转换为java.util.ArrayList android”

我的json

[{
    "header" : "buah air",
    "sub"    : {
                "warna" : "merah",
                "jenis" : "air"
               }
     },{
    "header" : "buah serat",
    "sub"    : {
                "warna" : "hijau",
                "jenis" : "serat"
               }

}]

我的模特

data class mTOP (
    val header : String,
    @SerializedName("sub") val sub : mSubTOP
)

data class mSubTOP(
    val warna : String,
    val jenis : String
)

我的MainActivity

val adapter =  adapter_top(response!!.body() as ArrayList<mTOP>)
rv.adapter = adapter

我的adapter_top(在这里发生错误)

override fun onBindViewHolder(holder: adapter_top.ViewHolder, position: Int) {

        holder.tvHeader?.text = Datane[position].header

        holder.rvList?.layoutManager = LinearLayoutManager(holder.rvList.context, LinearLayout.VERTICAL, false)
        var adapterSub = adapter_sub(Datane[position].sub as ArrayList<mSubTOP>)
        holder.rvList?.adapter = adapterSub
    }

我的adapter_sub

class adapter_sub(val Datane: ArrayList<mSubTOP>): RecyclerView.Adapter<adapter_sub.ViewHolder>() {

}

4 个答案:

答案 0 :(得分:0)

因为根本不是ArrayList :)您必须使用一个元素创建一个列表:

adapter_sub(arrayListOf(Datane[position].sub))

答案 1 :(得分:0)

这完成了我的adapter_sub

class adapter_sub(val Datane: ArrayList<mSubTOP>): RecyclerView.Adapter<adapter_sub.ViewHolder>() {

    override fun onBindViewHolder(holder: adapter_sub.ViewHolder, position: Int) {
        val location = Datane[position]
        holder.tvName?.text = location.warna
        holder.tvHobi?.text = location.jenis

    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): adapter_sub.ViewHolder {
        val v = LayoutInflater.from(parent.context).inflate(R.layout.layout_sub, parent, false)
        return ViewHolder(v)
    }

    override fun getItemCount(): Int {
        return Datane.size
    }

    class ViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) {
        val tvName = itemView.findViewById<TextView>(R.id.tvJenis)
        val tvHobi = itemView.findViewById<TextView>(R.id.tvWarna)
    }
}

答案 2 :(得分:0)

布局activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/RvMain"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:layout_editor_absoluteX="8dp"
        tools:layout_editor_absoluteY="8dp" >

    </androidx.recyclerview.widget.RecyclerView>
</androidx.constraintlayout.widget.ConstraintLayout>

layout layout_top.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <androidx.cardview.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="5dp">

        <LinearLayout
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <TextView
                android:id="@+id/tvHeader"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginLeft="16dp"
                android:layout_marginRight="16dp"
                android:layout_marginTop="16dp"
                android:gravity="center_vertical"
                android:text="Date"
                android:textAppearance="@style/Base.TextAppearance.AppCompat.Large"
                android:textColor="#009688"
                android:textSize="18sp" />

            <androidx.recyclerview.widget.RecyclerView
                android:id="@+id/rvItem"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginEnd="8dp"
                android:layout_marginStart="8dp"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent">

            </androidx.recyclerview.widget.RecyclerView>

        </LinearLayout>

    </androidx.cardview.widget.CardView>

</LinearLayout>

layout layout_sub.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        android:orientation="horizontal"
        android:padding="10dp">

        <TextView
            android:id="@+id/locationBadge"
            android:layout_width="40dp"
            android:layout_height="40dp"
            android:background="@drawable/circle_badge"
            android:gravity="center_vertical|center_horizontal"
            android:text="✓"
            android:textColor="#fff"
            android:textStyle="bold" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:padding="10dp">

            <TextView
                android:id="@+id/tvWarna"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="center_vertical"
                android:text="Name"
                android:textSize="18sp" />

            <TextView
                android:id="@+id/tvJenis"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="center_vertical"
                android:text="Address"
                android:textSize="16sp" />

        </LinearLayout>

    </LinearLayout>

</LinearLayout>

答案 3 :(得分:0)

这是我的堆栈跟踪

10-20 06:24:08.445 11624-11624/br.com.mirabilis.jambu_air E/AndroidRuntime: FATAL EXCEPTION: main
    Process: br.com.mirabilis.jambu_air, PID: 11624
    android.view.InflateException: Binary XML file line #14: Binary XML file line #14: Error inflating class TextView
        at android.view.LayoutInflater.inflate(LayoutInflater.java:543)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:427)
        at br.com.mirabilis.jambu_air.adapter.adapter_sub.onCreateViewHolder(adapter_sub.kt:23)
        at br.com.mirabilis.jambu_air.adapter.adapter_sub.onCreateViewHolder(adapter_sub.kt:13)
        at androidx.recyclerview.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:6794)
        at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5975)
        at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5858)
        at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5854)
        at androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2230)
        at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1557)
        at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1517)
        at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:612)
        at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3924)
        at androidx.recyclerview.widget.RecyclerView.onMeasure(RecyclerView.java:3336)
        at android.view.View.measure(View.java:18811)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5952)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:748)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:630)
        at android.view.View.measure(View.java:18811)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5952)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
        at androidx.cardview.widget.CardView.onMeasure(CardView.java:260)
        at android.view.View.measure(View.java:18811)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5952)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:748)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:630)
        at android.view.View.measure(View.java:18811)
        at androidx.recyclerview.widget.RecyclerView$LayoutManager.measureChildWithMargins(RecyclerView.java:9119)
        at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1583)
        at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1517)
        at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:612)
        at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3924)
        at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:3641)
        at androidx.recyclerview.widget.RecyclerView.onLayout(RecyclerView.java:4194)
        at android.view.View.layout(View.java:16653)
        at android.view.ViewGroup.layout(ViewGroup.java:5438)
        at androidx.constraintlayout.widget.ConstraintLayout.onLayout(ConstraintLayout.java:1915)
        at android.view.View.layout(View.java:16653)
        at android.view.ViewGroup.layout(ViewGroup.java:5438)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
        at android.view.View.layout(View.java:16653)
        at android.view.ViewGroup.layout(ViewGroup.java:5438)
        at androidx.appcompat.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:444)
        at android.view.View.layout(View.java:16653)
        at android.view.ViewGroup.layout(ViewGroup.java:5438)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
        at android.view.View.layout(View.java:16653)
        at android.view.ViewGroup.layout(ViewGroup.java:5438)
        at android.widget.LinearLayout.setCh
10-20 06:24:08.448 11624-11624/br.com.mirabilis.jambu_air E/MQSEventManagerDelegate: failed to get MQSService.
10-20 06:24:08.473 11624-11624/br.com.mirabilis.jambu_air I/Process: Sending signal. PID: 11624 SIG: 9