回收器视图应该从提供给它的双数组中创建按钮。回收站视图显示为空。不知道为啥
Posted
技术标签:
【中文标题】回收器视图应该从提供给它的双数组中创建按钮。回收站视图显示为空。不知道为啥【英文标题】:recycler view is supposed to create buttons from the double-array provided to it. the recycler view shows up empty instead. no idea why回收器视图应该从提供给它的双数组中创建按钮。回收站视图显示为空。不知道为什么 【发布时间】:2022-01-01 14:26:39 【问题描述】:至于我试图解决的问题,创建了多个适配器,我认为可能会解决问题,并创建了新的按钮布局。添加 toasts 以查看我正在谈论的双数组是否已被结果页面接收到。(它有)。这些只是我记得的一些。
另外,我是安卓新手。所以...
无论如何,我有一张可能更容易理解的图片 - 从左下选项卡的底部 cmets 开始...
android studio screen shot
this is the new screenshot image
this is the code where the problem finally was solved
下面也添加了代码。
这就是问题的开始。我觉得……
结果页面类-
package com.kenetic.calculator_practice
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Toast
import androidx.core.view.isEmpty
import androidx.recyclerview.widget.RecyclerView
import com.kenetic.calculator_practice.databinding.ActivityResultPageBinding
import com.kenetic.calculator_practice.databinding.ResultPageTestingBinding
class ResultPage : AppCompatActivity()
lateinit var resRecyclerView: RecyclerView
lateinit var binding : ResultPageTestingBinding
companion object var LIST = "list"
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_result_page)
//resRecyclerView = findViewById(R.id.results_recyler_view)
resRecyclerView = findViewById(R.id.test_recycler_view_one)
val ListToSend = intent.extras?.getDoubleArray(LIST)!!.toList().toDoubleArray()
resRecyclerView.adapter = ResultsAdapter(this,ListToSend)
if (resRecyclerView.isEmpty())
if (ListToSend.isEmpty())
Toast.makeText(this, "list and view empty", Toast.LENGTH_SHORT).show()
else
Toast.makeText(this, ("only view empty "+ListToSend.size.toString()),Toast.LENGTH_SHORT).show()
//TODO - returning only view empty -_- That makes 0 sense.
// any idea why the view is empty if the list isn't? cause I have been searching
// the required conditions for a view to be empty and found almost nothing useful
结果适配器类 -
package com.kenetic.calculator_practice
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.Toast
import androidx.recyclerview.widget.RecyclerView
class ResultsAdapter (
private val context:Context,
private val dataSet : DoubleArray) : RecyclerView.Adapter<ResultsAdapter.ResultViewHolder>()
class ResultViewHolder(view:View) : RecyclerView.ViewHolder(view)
val textButton : Button = view.findViewById(R.id.result_button_test)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ResultViewHolder
val buttonView = LayoutInflater.from(parent.context).inflate(R.layout.test_button_layout,parent,false)
makeToast()
return ResultViewHolder(buttonView)
override fun onBindViewHolder(holder: ResultViewHolder, position: Int)
holder.textButton.text = dataSet[position].toString()
override fun getItemCount(): Int = dataSet.size
fun makeToast()
Toast.makeText(context,dataSet[1].toString(),Toast.LENGTH_SHORT).show()
//TODO even this isn't getting called -_-
按钮布局 - 文件名 - test_button_layout
<?xml version="1.0" encoding="utf-8"?>
<GridLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_
android:layout_
android:layout_margin="10dp">
<Button
android:id="@+id/result_button_test"
android:layout_
android:layout_/>
</GridLayout>
最后,这是按钮应该可见的地方。 Recycler 视图 xml 文件-名称-activity_result_page.xml
<?xml version="1.0" encoding="utf-8"?>
<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_
android:layout_>
<Button
android:id="@+id/button"
android:layout_
android:layout_
android:layout_marginTop="100dp"
android:text="Button"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/test_recycler_view_one"
android:layout_
android:layout_
android:layout_margin="20dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/button" />
</androidx.constraintlayout.widget.ConstraintLayout>
任何形式的帮助都会非常受欢迎。提前谢谢...
【问题讨论】:
【参考方案1】:如果您的Adapter
为空,则永远不会调用onCreateViewHolder
,这意味着永远不会调用currentDataSet = dataSet
。因此,您的适配器将永远不会包含任何要显示的数据。
所以你可以做两件事
删除currentDataSet
,只使用dataSet
,无论如何你都用它来初始化Adapter
。
或
在您的 Adapter
中创建一个设置器
fun submitArray(doubleArray : DoubleArray)
dataSet = doubleArray
notifyDataSetChanged();
当你有新数据要显示时调用它。
【讨论】:
好的,我删除了当前的数据集变量。它没有显示错误。然而,回收站视图是空的。如果视图为空,我在结果页面中创建了一个 if 语句来祝酒,然后显示提供给它的数据集的长度。它返回“空”,后跟数组的长度(不为零)。那么,如果正在传递数组,那么为什么适配器类没有运行 onCreate?即使在上面我添加的图像中,为什么它不会运行 onCreate?我知道它没有运行,因为我也在那里添加了一个没有被执行的 toast。基本上,为什么它是空的? 您可以编辑上面提供的代码以反映您所做的更改吗? 是的,刚刚进行了更改。此外,顶部还添加了一个新的屏幕截图图像。谢谢你的帮助。 你能不能让你的RecyclerView
固定大小不是 0dp、0dp 而是像 150dp x 150dp 并在 xml 中将其背景更改为另一种颜色,如蓝色。因此,您可以在应用程序运行时查看它是否为项目创建空间。RecyclerView
+ ConstraintLayout
s 有时可能很粗略,在预览中说一件事,但在设备上的行为完全不同。
我做到了。它没有用。回收站视图在那里,但是是空的。这次列表也不是问题。之后,我删除了一些我之前用于测试目的的 xml 文件。然后,删除了一些未使用的导入。突然之间,它现在可以工作了。我仍然不知道如何,但至少它现在有效。凉爽的。无论如何,我已经在靠近顶部的地方添加了最终的工作代码。第三个链接。以上是关于回收器视图应该从提供给它的双数组中创建按钮。回收站视图显示为空。不知道为啥的主要内容,如果未能解决你的问题,请参考以下文章