我的适配器似乎正在接收数据,但是没有显示在我的RecyclerView中。关于我在做什么错的任何想法吗?

问题描述 投票:0回答:1

所以,我已经调试了一段时间,但似乎找不到我的错误在哪里。在我的调试控制台上,它显示了我从响应中收到的项目列表的大小,以及与列表中每个项目相关的数据。它还显示了我在适配器上设置的textviews的ID,但是当我加载应用程序时,我只收到在片段上设置的Toast消息以验证我是否在接收数据,但textviews上没有数据

ListFragment

class ListFragment : Fragment() {

    private val spaceVM : MainViewModel by viewModels()
    private lateinit var spaceAdapter: SpaceAdapter

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_list, container, false)
    }

    override fun onResume() {
        super.onResume()
        setUpObserver()
    }

    private fun setUpObserver(){
        spaceVM.spaceLiveData.observe(this, Observer {
            val data = spaceVM.spaceLiveData.value
            if (data != null) {
                Toast.makeText(context, data.toString(), Toast.LENGTH_LONG).show()
                //ID of my recycler view using Kotlin Android Extensions
                rvSpace.apply {
                    layoutManager = LinearLayoutManager(activity)
                    spaceAdapter = SpaceAdapter()
                    spaceAdapter.submitSpaceList(data)
                    adapter = spaceAdapter
                }

            }

        })
    }
}

SpaceAdapter

class SpaceAdapter : RecyclerView.Adapter<RecyclerView.ViewHolder>() {

    private var items : List<SpaceXResponse> = ArrayList()

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        return SpaceViewHolder(
            LayoutInflater.from(parent.context).inflate(R.layout.card, parent, false)
        )
    }
    override fun getItemCount(): Int {
        return items.size
    }

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        when(holder){
            is SpaceViewHolder ->{
                holder.bind(items.get(position))
            }
        }
    }


    fun submitSpaceList(spaceList : List<SpaceXResponse>){
        items = spaceList
    }

    class SpaceViewHolder constructor(itemView: View) : RecyclerView.ViewHolder(itemView){
        val missionName : TextView = itemView.tvMissionName
        val rocketName : TextView = itemView.tvRocketName
        val launchSite : TextView = itemView.tvLaunchSite
        val dol : TextView = itemView.tvDOL

        fun bind(spacePost : SpaceXResponse){
            missionName.setText(spacePost.missionName)
            rocketName.setText(spacePost.rocket?.rocketName)
            launchSite.setText(spacePost.launchSite?.siteName)
            dol.setText(spacePost.launchDateLocal)
        }
    }
}

也许这可能是我在onBindViewHolder上设置我的持有人的方式?我在上面放了一个调试断点,我得到:“ ViewHolder {e0b3537 position = 0 id = -1,oldPos = -1,pLpos:-1 no parent}”,但我觉得我已经在onCreateViewHolder上添加了父级]

这是我的片段xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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=".view.ListFragment">
<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_constraintBottom_toTopOf="@+id/card"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/rvSpace"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

    </ScrollView>

</androidx.constraintlayout.widget.ConstraintLayout>

</FrameLayout>

这是我要充入我的RecyclerView的Card xml

<?xml version="1.0" encoding="utf-8"?>
    <com.google.android.material.card.MaterialCardView
xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_margin="10dp"
        android:gravity="center"
        app:layout_constraintBottom_toTopOf="@+id/card"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="305dp">

            <TextView
                android:id="@+id/tvMissionName"
                android:layout_width="match_parent"
                android:layout_height="0dp"
                app:layout_constraintBottom_toTopOf="@+id/tvRocketName"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintHorizontal_bias="0.0"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent" />

            <TextView
                android:id="@+id/tvRocketName"
                android:layout_width="match_parent"
                android:layout_height="0dp"
                app:layout_constraintBottom_toTopOf="@id/tvLaunchSite"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/tvMissionName" />

            <TextView
                android:id="@+id/tvLaunchSite"
                android:layout_width="match_parent"
                android:layout_height="0dp"
                android:text="@{space.launchSite.siteName}"
                app:layout_constraintBottom_toTopOf="@id/tvDOL"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/tvRocketName" />

            <TextView
                android:id="@+id/tvDOL"
                android:layout_width="match_parent"
                android:layout_height="0dp"
                app:layout_constraintBottom_toTopOf="@+id/ivImage"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="@+id/tvLaunchSite" />

            <ImageView
                android:id="@+id/ivImage"
                android:layout_width="350px"
                android:layout_height="350px"
                android:src="@drawable/ic_launcher_background"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent" />
        </androidx.constraintlayout.widget.ConstraintLayout>
    </com.google.android.material.card.MaterialCardView>

所以,我已经调试了一段时间,但似乎找不到我的错误在哪里。在我的调试控制台上,它显示了我从响应中接收到的项目列表的大小,以及与每个项目相关的数据...

android android-fragments kotlin android-recyclerview adapter
1个回答
0
投票

我认为,您在适配器上丢失了notifyDatasetChanged呼叫。

© www.soinside.com 2019 - 2024. All rights reserved.