回收器视图应该从提供给它的双数组中创建按钮。回收站视图显示为空。不知道为啥

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 + ConstraintLayouts 有时可能很粗略,在预览中说一件事,但在设备上的行为完全不同。 我做到了。它没有用。回收站视图在那里,但是是空的。这次列表也不是问题。之后,我删除了一些我之前用于测试目的的 xml 文件。然后,删除了一些未使用的导入。突然之间,它现在可以工作了。我仍然不知道如何,但至少它现在有效。凉爽的。无论如何,我已经在靠近顶部的地方添加了最终的工作代码。第三个链接。

以上是关于回收器视图应该从提供给它的双数组中创建按钮。回收站视图显示为空。不知道为啥的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android Studio 中创建自定义图像按钮?

长按回收站视图项目时显示按钮

防止适配器在滚动时回收视图(编辑永远不会这样做。)

能够滚动无休止的循环回收器视图,但无法单击特定列表项

具有回收器视图的线性布局管理器不反转

如何在第一个活动中更新回收站视图,同时更改其他活动中的数据?