Мой адаптер, кажется, получает данные, но они не отображаются в моем RecyclerView. Есть идеи, что я делаю не так? - PullRequest
0 голосов
/ 08 марта 2020

Итак, я некоторое время отлаживал, и я не могу найти, где моя ошибка. На моей консоли отладки он показывает размер списка элементов, который я получаю из ответа, с данными, связанными с каждым элементом в списке. Он также показывает идентификатор текстовых представлений, которые я установил на адаптере, но когда я загружаю приложение, я получаю только сообщение Toast, которое я установил в своем фрагменте, чтобы убедиться, что я получаю данные, но нет данных в моих текстовых представлениях

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>

А вот моя карта 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>

1 Ответ

1 голос
/ 08 марта 2020

Я думаю, вы потеряли notifyDatasetChanged вызов на вашем адаптере.

Также xml из виджета выглядит немного подозрительно, его высота равна 0, и он использует ограничение высоты для несуществующего идентификатора app:layout_constraintBottom_toTopOf="@+id/card". В конце концов, вы можете сузить место ошибки, вы можете настроить вход в bindviewholder, чтобы получить, если данные установлены. Если адаптер связывает держатель надлежащее количество раз - проблема в коде держателя

...