【问题标题】:My Adapter seems to be receiving data, but it's not being displayed in my RecyclerView. Any ideas as to what I am doing wrong?我的适配器似乎正在接收数据,但它没有显示在我的 RecyclerView 中。关于我做错了什么的任何想法?
【发布时间】:2020-03-07 23:47:07
【问题描述】:

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

列表片段

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
                }

            }

        })
    }
}

空间适配器

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>

这是我的 Card xml,我正在尝试将其添加到我的 RecyclerView 中

<?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】:

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

    另外,viewholder 的 xml 看起来有点可疑,它的高度为 0,并且在不存在的 id app:layout_constraintBottom_toTopOf="@+id/card" 上使用高度约束。毕竟,您可以缩小错误位置,您可以在 bindviewholder 上设置登录,以获取是否设置了数据。如果适配器绑定持有者正确的次数 - 那么问题在于视图持有者代码

    【讨论】:

    • 你说得对,我确实忘记设置 notifyDataSetChanged。只是把它放在谢谢你:),但我的 RecyclerView 上仍然没有显示
    • viewholder 的 xml 看起来也有点可疑,它的高度为 0,并且在不存在的 id app:layout_constraintBottom_toTopOf="@+id/card" 上使用了高度约束,毕竟你可以缩小错误的地方,你可以在 bindviewholder 上设置登录,得到如果设置了数据。如果适配器绑定持有者正确的次数 - 那么问题就在视图持有者代码中。
    猜你喜欢
    • 2021-04-22
    • 1970-01-01
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-17
    相关资源
    最近更新 更多