Warm tip: This article is reproduced from serverfault.com, please click

android-Recyclerview视图未填充

(android - Recyclerview view not populating)

发布于 2020-11-28 17:10:08

我是一名Kotlin新手,正在学习如何创建简单的recyclerview应用程序。我的代码应该在垂直堆叠的单元格中列出整数1..10。但是,它仅列出第一项。我查阅了一些教程,并多次(长时间休息后)复习了我的代码,但是我看不出代码有什么问题。

今天早些时候,我想到了打印Log语句的好主意。检查它们,我注意到我的onBindViewHolder函数仅被调用一次。我在犯什么错误?

这是我的日志输出:

D/QuoteAdapter: value is: 1
D/QuoteAdapter: index is: 0
D/QuoteAdapter: Size is: 10

我的活动:

class MainActivity : AppCompatActivity() {
    lateinit var mRecyclerView: RecyclerView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        mRecyclerView = findViewById(R.id.recyclerView)
        mRecyclerView.layoutManager = LinearLayoutManager(this)

        mRecyclerView.adapter = QuoteAdapter()
        //mRecyclerView.setHasFixedSize(true)
    }
}

我的适配器:

class QuoteAdapter : RecyclerView.Adapter<QuoteViewHolder>() {
    private val listOfInts = intArrayOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
    private val TAG = "QuoteAdapter"

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): QuoteViewHolder {
        val view = LayoutInflater.from(parent.context)
                .inflate(R.layout.recyclerview_item_row, parent, false)
        return QuoteViewHolder(view)
    }

    override fun getItemCount(): Int {
        Log.d(TAG, "Size is: ${listOfInts.size.toString()}")
        return listOfInts.size
    }

    override fun onBindViewHolder(holder: QuoteViewHolder, position: Int) {
        val item = listOfInts[position]
        Log.d(TAG, "value is: ${item.toString()}")
        Log.d(TAG, "index is: ${position.toString()}")
        holder.listTitle.text = item.toString()
    }
}

我的观看者:

class QuoteViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
    val listTitle = itemView.findViewById(R.id.itemString) as TextView
}

我的布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/itemString"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

我的主要布局如下所示:

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

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginStart="8dp"
        android:layout_marginLeft="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginRight="8dp"
        android:layout_marginBottom="8dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
Questioner
user1801060
Viewed
0
David Kroukamp 2020-11-29 02:32:37

在你的“我的布局”中尝试以下操作:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/itemString"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

通知layout_heightLinearLayout已经更改为wrap_content

还怀疑android:orientation="vertical"ViewHolder的项目xml是否需要,除非TextView将来你添加的不止1个