【发布时间】: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