Recycleview物品没有显示在应用芬兰湾的科特林/ Android &g



我正在制作一个测验应用程序,并希望通过使用recycleview来显示应用程序上的问题,但由于某种原因,问题没有显示。

问题的数据类:

data class Question(
val questionText: String,
val isCorrect: Boolean
)

QuestionAdapter:

class QuestionAdapter(private val questions: List<Question>) : RecyclerView.Adapter<QuestionAdapter.ViewHolder>() {

inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {

val binding = ItemQuestionBinding.bind(itemView)

fun databind(question: Question) {
binding.tvQuestion.text = question.questionText
}
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
return ViewHolder(
LayoutInflater.from(parent.context).inflate(R.layout.item_question, parent, false)
)
}

override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.databind(questions[position])
}

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

MainActivity(问题仍然是硬编码的):

class MainActivity : AppCompatActivity() {
private val questions = arrayListOf<Question>()
private val questionAdapter = QuestionAdapter(questions)
private lateinit var binding: ActivityMainBinding


override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)

initViews()

}

private fun initViews() {
binding.rvQuestions.layoutManager = LinearLayoutManager(this@MainActivity, RecyclerView.VERTICAL, false)
binding.rvQuestions.adapter = questionAdapter
binding.rvQuestions.addItemDecoration(DividerItemDecoration(this@MainActivity, DividerItemDecoration.VERTICAL))

questions.addAll(generateQuestions())
questionAdapter.notifyDataSetChanged()

}

/**
* Generate questions static for now
*/
private fun generateQuestions(): ArrayList<Question> {
return arrayListOf(
Question("A 'val' and 'var' are the same", false),
Question("MAD grants 12 ECTS", false),
Question("Java and Kotlin syntax is the same", false),
Question("Kotlin 'when' operator replaces the 'switch' operator in Java", true),
Question("A Unit in Kotlin corresponds to a void in Java", true),
)
}
}

我的活动主xml:

<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">

<TextView
android:id="@+id/txtTitle"
style="@style/TextAppearance.MaterialComponents.Headline5"
android:layout_width="302dp"
android:layout_height="89dp"
android:layout_marginTop="16dp"
android:gravity="start"
android:text="@string/quiz_instructions"
app:layout_constraintHorizontal_bias="0.146"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<TextView
android:id="@+id/txtSecTitle"
style="@style/TextAppearance.MaterialComponents.Headline6"
android:layout_width="302dp"
android:layout_height="89dp"
android:layout_marginTop="44dp"
android:gravity="start"
android:text="@string/answer_instructions"
app:layout_constraintHorizontal_bias="0.146"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rvQuestions"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginBottom="8dp"
app:layout_constraintBottom_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />



</androidx.constraintlayout.widget.ConstraintLayout>

And my item_question xml:

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="72dp"
xmlns:tools="http://schemas.android.com/tools">



<TextView
android:id="@+id/tvQuestion"
style="@style/MaterialAlertDialog.MaterialComponents.Title.Text"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="16dp"
android:layout_marginBottom="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="Use tools:text to see preview text only in editor" />
</androidx.constraintlayout.widget.ConstraintLayout>
我在另一个项目中使用了类似的设置来显示项目的列表视图,在那里它工作得很好。但在这里,当应用程序启动时,问题不会显示。

你应该使用这个初始化

private val questions = arrayListOf<Question>()
private val questionAdapter = QuestionAdapter(questions)

by this way

private lateinit var questionAdapter : QuestionAdapter

,那么你可以通过这里的(问题)

questions.addAll(generateQuestions())
binding.rvQuestions.layoutManager = LinearLayoutManager(this@MainActivity, RecyclerView.VERTICAL, false)
binding.rvQuestions.adapter = questionAdapter
binding.rvQuestions.addItemDecoration(DividerItemDecoration(this@MainActivity, DividerItemDecoration.VERTICAL))
questionAdapter.notifyDataSetChanged()
这样初始化是正确的,现在项目将显示

您使适配器初始化复杂化了。删除这一行

private val questionAdapter = QuestionAdapter(questions)

并更改函数,如下所示。

private fun initViews() {
binding.rvQuestions.layoutManager = LinearLayoutManager(this@MainActivity, RecyclerView.VERTICAL, false)
questions.addAll(generateQuestions())
binding.rvQuestions.addItemDecoration(DividerItemDecoration(this@MainActivity, DividerItemDecoration.VERTICAL))  
binding.rvQuestions.adapter = QuestionAdapter(questions)             
}

现在它应该工作了。仅在需要时使用通知数据更改。其昂贵。

需要参考的可以看看这个教程

最新更新