向下滚动时 RecyclerView 项目的值会重置

2024-02-11

这是我想要做的场景:我正在创建一个 RecyclerView,它可以添加或删除一个或多个具有 EditText 的子项目/片段/视图,但是......

这是我的问题:每当我在 RecyclerView 中向下滚动时,其项目的值就会重置。我认为这里的问题是 RecyclerView 适配器无法绑定或保存这些值,但我不知道我的代码中问题到底出在哪里。

class StocksAdapter() : RecyclerView.Adapter<ViewHolder>() {


class StockFragmentHolder : ViewHolder {
    fun Double.format(digits: Int) = java.lang.String.format("%,.${digits}f", this)


    lateinit var numberOfShares: EditText;
    lateinit var buyPrice: EditText;
    lateinit var btnCompute: Button
    lateinit var btnRemove: Button
    lateinit var stockAveragePrice: TextView
    lateinit var stockTotalAmount: TextView
    private var savedStock : Stock? = null

    constructor(view: View) : super(view) {
        numberOfShares = view.findViewById(R.id.stockNumberOfShares)
        buyPrice = view.findViewById(R.id.stockBuyPrice)
        btnCompute = view.findViewById(R.id.btnCompute)
        btnRemove = view.findViewById(R.id.btnRemove)
        stockAveragePrice = view.findViewById(R.id.stockAveragePrice)
        stockTotalAmount = view.findViewById(R.id.stockTotalAmount)
    }


    fun populateView(stock: Stock, onStocksAdapterListener: OnStocksAdapterListener, position: Int) {

        if(savedStock == null || stock.buyPrice > 0 || stock.numberOfShares > 0) {
            savedStock = stock
        }

        this.buyPrice.setText(if (savedStock!!.buyPrice <= 0.0) "" else savedStock!!.buyPrice.toString())
        this.numberOfShares.setText(if (savedStock!!.numberOfShares <= 0.0) "" else savedStock!!.numberOfShares.toString())
        this.stockAveragePrice.text = "0"
        this.stockTotalAmount.text = "0"

        this.btnCompute.setOnClickListener(View.OnClickListener {

            var stock = Stock();

            stock.numberOfShares = this.numberOfShares.text.toString().toLongOrNull()
            stock.buyPrice = this.buyPrice?.text.toString().toDoubleOrNull()
            stock.sellPrice = 0.0


            if (stock.numberOfShares != null || stock.numberOfShares != 0L) {

                var buyTotalAmount: Double = 0.0;
                buyTotalAmount = StocksCalculator.calculateTotalSharesPrice(stock, StocksCalculator.TRANSACTION_FEE_BASE_VALUES, Constants.TRANSACTION_TYPE.TRANSACTION_TYPE_BUY)

                var averagePricePerShare = (buyTotalAmount / stock.numberOfShares)

                this.stockAveragePrice.text = averagePricePerShare.format(2);
                this.stockTotalAmount.text = "" + buyTotalAmount.format(2)

                onStocksAdapterListener.onStocksComputeButtonClicked(stock.numberOfShares, averagePricePerShare, buyTotalAmount, position)
            }
        })

        this.btnRemove.setOnClickListener(View.OnClickListener {
            onStocksAdapterListener.onStocksRemoveButtonClicked(position)
        })

    }
}


lateinit var onStocksAdapterListener: OnStocksAdapterListener;
lateinit var listStocks: ArrayList<Stock>

public constructor(listStocks: ArrayList<Stock>, onStocksAdapterListener: OnStocksAdapterListener) : this() {
    this.listStocks = listStocks
    this.onStocksAdapterListener = onStocksAdapterListener
    setHasStableIds(true)

}

override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): RecyclerView.ViewHolder {
    var itemView = LayoutInflater.from(parent?.getContext())
            .inflate(R.layout.fragment_stock, parent, false)
}

override fun getItemViewType(position: Int): Int {
    return position
}


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

override fun onBindViewHolder(holder: RecyclerView.ViewHolder?, position: Int) {
    var stock: Stock = listStocks.get(position)
    holder.populateView(stock, this.onStocksAdapterListener, position)
}


public interface OnStocksAdapterListener {
    public fun onStocksAddButtonClicked()

    public fun onStocksComputeButtonClicked(numberOfShares: Long?, averagePricePerShare: Double?, averageTotalAmount: Double?, position: Int)

    public fun onStocksRemoveButtonClicked(position: Int)
}

以下是我在片段中创建 recyclerView 的方法:

    val mLayoutManager = LinearLayoutManager(this.context)
    var recyclerView: RecyclerView = view.findViewById(R.id.recyclerView)

    val itemDecorator = DividerItemDecoration(context, DividerItemDecoration.VERTICAL)
    itemDecorator.setDrawable(ContextCompat.getDrawable(context, R.drawable.divider))
    recyclerView.addItemDecoration(itemDecorator)
    recyclerView.setLayoutManager(mLayoutManager)
    recyclerView.setItemAnimator(DefaultItemAnimator())
    recyclerView.adapter = stocksAdapter

我尝试禁用 ViewHolder 的 setIsRecyclable 但问题仍然存在。

防止 RecyclerView 停止重置值的最佳方法是什么?或者我应该用ListView替换RecyclerView?


我通过增加回收器视图的缓存大小找到了解决方法。只需确保缓存大小足以满足您的应用程序的需求。

code:

recyclerView.setItemViewCacheSize(int);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

向下滚动时 RecyclerView 项目的值会重置 的相关文章

  • v7 RecyclerView NullPointerException AccessibilityDelegateCompat.getBridge()

    运行我的 recyclerview 列表片段时出现此错误 java lang NullPointerException Attempt to invoke virtual method java lang Object android su
  • 对话框上的 EditText 不返回任何文本

    我太累了 找不到错误 我没有发现任何错误 但我没有从 editText 收到任何文本 请看下面的代码 活动密码 xml
  • 在 Anko DSL 中创建自定义 View/ViewGroup 类

    我想创建一个自定义视图 它只是一些 Android 视图的包装 我考虑创建一个自定义 ViewGroup 来管理其子视图的布局 但我不需要这么复杂 我基本上想做的是 class MainActivity verticalLayout tex
  • Android 自定义视图不能以正确的方式处理透明度/alpha

    我正在绘制自定义视图 在此视图中 我使用两个不同的绘画和路径对象在画布上绘画 我基本上是在绘制两个重叠的形状 添加 Alpha 后 视图中重叠的部分比图像的其余部分更暗 这是不希望的 但我不知道如何解决它 这是我的代码片段 用于展示我如何在
  • ProGuard 无法与 Windows 中使用的 Joda Time 一起编译

    实际上 这是一个答案 而不是一个问题 我确实在 Windows 上花了很多时间 使用 JodaTime 并使用 ProGuard 将其包含在我的 Android 项目中 混淆器配置 libraryjars C Users Reto Docu
  • 毕加索动画加载图像

    我有以下代码在毕加索中加载图像 使用可绘制的占位符在图像下载时显示 不过 我想要的是一个动画旋转进度条样式的旋转器 它可以在图像加载时不断地旋转 就像我在大多数专业应用程序中看到的那样 毕加索似乎不支持这一点 只支持静态图像可绘制 有没有办
  • Firestore - RecycleView - 图像持有者

    我不知道如何编写图像的支架 我已经设置了 2 个文本 但我不知道图像的支架应该是什么样子 你能帮我告诉我图像的文字应该是什么样子才能正确显示吗 holder artistImage setImageResource model getArt
  • 在 Jetpack Compose 中跨可组合函数重复使用一组预览注释

    在 Jetpack Compose 中迈出第一步 这非常令人惊奇 除了一个恼人的问题 我有一组固定的预览 正常 深色和 RTL Preview name Normal group Screen showBackground true Pre
  • 如何在 Android NDK 中创建新的 NativeWindow 而无需 Android 操作系统源代码?

    我想编译一个 Android OpenGL 控制台应用程序 您可以直接从控制台启动 Android x86 运行 或者从 Android x86 GUI 内的 Android 终端应用程序运行 这个帖子 如何在 Android NDK 中创
  • Android Studio IDE 上的“文本/设计”选项卡缺少新的 Android 项目

    如何在创建新项目期间自动创建的 Activity main xml 文件的 src main res layout 文件夹中启用文本 设计选项卡 如果我右键单击并在所述文件夹上创建 xml 文件 则设计 文本选项卡存在 有什么建议吗 谢谢
  • Vimeo 视频在 Android 6 设备上停止播放

    我正在尝试在我的应用程序中播放 Vimeo 的视频 问题是在 Android 6 设备上 视频会在一定时间后停止播放 在 API 较低的设备上一切正常 时间取决于质量 对于下面提供的网址的视频 播放一定分钟 1 到 3 视频质量有多低 播放
  • NoClassDefFoundError:无法解析:Landroid/support/v7/appcompat/R$styleable

    新手尝试完成 Google 提供的我的第一个应用程序教程 在这个致命异常的过程中 我确实导入了很多随机包来消除许多事情的 无法解析 错误 例如 ActionBarActivity EditText Fragment LayoutInflat
  • 将图像添加到自定义 AlertDialog

    我制作了一个 AlertDialog 让用户可以从我显示的 4 个选项中选择一个 前 3 个让他们在单击号码时直接拨打号码 第 4 个显示不同的视图 现在看起来是这样的 由于第四个选项的目的是不同的任务 我想让它看起来不同 因为用户可能会感
  • 无法将类型“System.IO.Stream”隐式转换为“Java.IO.InputStream”

    我提到了一些类似的问题 但没有一个涉及IO 当我使用时 我在java中使用了相同的代码Eclipse 那次就成功了 但现在我尝试在中使用这段代码Mono for Android C 它不起作用 我正在尝试运行此代码来创建一个InputStr
  • Android - 9 补丁

    我正在尝试使用 9 块图片创建一个新的微调器背景 我尝试了很多方法来获得完美的图像 但都失败了 s Here is my 9 patch 当我用Draw 9 patch模拟时 内容看起来不错 但是带有箭头的部分没有显示 或者当它显示时 这部
  • 安卓的限制

    我需要构建一个应用程序 该应用程序拍摄相机图像并将其上传到网络 在网络上进行一些处理并返回真 假 我在这方面遇到了一些问题 希望得到澄清 1 我的应用程序有什么方法可以知道 Android 相机捕获的图像吗 我从这里明白了什么 Androi
  • Android 自定义警报对话框中的 OnClickListener

    我是一个自学成才的初学者 感谢耐心 谢谢 在 Eclipse 中 我使用自己的 xml 文件 custom dialog 创建了一个自定义警报对话框 称为 usernamealert 如果用户尚未输入用户名 即 username lengt
  • Android ScrollView fillViewport 不工作

    我有一个简单的布局 名称位于顶部 按钮位于屏幕底部 或者超出该按钮 以防我添加更多项目 所以我使用带有 LinearLayout 的 ScrollView 如下所示
  • 在 Android 中使用 iText 将图像添加到特定位置

    我想使用 Android 中的 iText 将图像添加到 PDF 文件中的特定位置 这是一个可填写的表单 我添加了作为图像占位符的文本框 我想要做的就是像这样获取该文本框和图像 public class FormFill public st
  • Android:如何检测手机设置中的语言已更改

    我如何检测我的手机语言是否已更改 例如 Facebook 应用程序将向我们宣布 please wait we preparing your language i used myString Locale getDefault getDisp

随机推荐

  • python pycparser设置错误

    我在 CentOS 7 上通过 pip 设置 pyparser 时看到以下错误 usr bin python2 u c import setuptools tokenize file tmp pip build PMzCYU pycpars
  • GMSAutocompleteViewController iOS,如何更改搜索栏中的文本颜色[重复]

    这个问题在这里已经有答案了 我正在使用 GMSAutocompleteViewController 并想要更改 searchBar 中的 textColor 但找不到方法 我设法更改了一些颜色但没有更改 searchBar 文本 我尝试过以
  • hostconfig.json 在哪里(Docker 桌面 + WSL2 环境)

    据我所知 docker不支持任何在创建容器后更改端口映射的命令 但这个答案说 通过更改 hostconfig json 文件 我可以更改端口映射 如何将端口映射分配给现有的 Docker 容器 https stackoverflow com
  • `System.currentTimeMillis()` 在多个进程中是否正确?

    我们遇到这样的情况 主进程写入日志 然后它会生成多个工作进程 这些进程会写入自己的日志 我希望工作人员通过主服务器登录 但由于某种原因 这个想法遭到了抵制 我想知道的是 我可以相信多个文件中最终的时间戳彼此一致吗 即 如果我将日志文件合并为
  • 让 WiX/Burn 检测所需的 .NET Framework 版本

    我怎样才能拥有Burn http en wikipedia org wiki WiX Burn检测是否安装了所需的 NET 4 5 框架 如果没有在启动自定义 UI 之前通知用户该安装需要 NET 4 5 才能运行 如果没有先决条件检查 我
  • 当我使用 Chutzpah.json 文件时,使用 Chutzpah 运行测试时出现问题

    当我提供 Chutzpah json 文件时 我在让 Chutzpah 运行我的打字稿测试时遇到问题 我的项目如下所示 我的 Chutzpah json 文件如下所示 Compile Mode External ExtensionsWith
  • 透明视图上的 UITapGestureRecognizer

    我有一个带有视图的树 其中最高级别的视图是透明的 并且包含图像或标签 具有透明背景 将 UITapGestureRecognizer 附加到此视图时 我仅收到有关包含图像的视图的通知 另外 如果我将视图留空 那么仅当背景颜色与 UIColo
  • “按 Enter 开始游戏” XNA 简介屏幕

    我创建了一个介绍屏幕 其中包含 按 Enter 开始游戏 然后退出 当然退出没有问题 但让游戏开始有点困难 有什么建议吗 最简单的方法是设置状态机 看起来真的很简单 enum GameState TitleScreen 0 GameStar
  • 如何从 Fluent-ffmpeg 传输到 AWS s3?

    我想 const passthroughStream new PassThrough ffmpeg stream audioBitrate 8 output passthroughStream end true on progress p
  • 如何编辑dll档案?

    好吧 所以我对 DLL 不太了解 但我需要编辑其中一些 那些看起来像存档文件的文件 如 firefox的xul dll windows twain 32 dll 当我尝试在 NET Reflector 中打开它们时 它无法打开它们 这里的一
  • 从 csv 文件加载约束(amazon deequ)

    我正在查看 Deequ 它看起来是一个非常好的图书馆 我想知道是否可以从 HDFS 中的 csv 文件或 orc 表加载约束 假设我有一张包含这些类型的表 case class Item id Long productName String
  • 在线性模型中结合cbind和paste

    我想知道我怎样才能想出一个lm公式语法使我能够使用paste和 一起cbind用于多元多元回归 Example 在我的模型中 我有一组变量 对应于下面的原始示例 data mtcars depVars lt paste mpg disp i
  • 如何将列表转换为每行包含 N 个项目的 CSV 文件?

    我想创建一个新的 CSV 文件 每行包含 3 个项目 我的源文件如下所示 没有新行 换行符 12123 1324 232324 243443 234 2345 2334 2445 22355 222234 2345 现在我想将此文件转换为
  • PHP 数组语法解析错误左方括号“[”[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我有一个返
  • 将 Base64 转换为 png 并保存在设备中 React Native Expo

    我一直在尝试使用 React Native 和 Expo 在移动设备上保存图像 我尝试过这些软件包 import RNFetchBlob from react native fetch blob import RNfs from react
  • .png 图像在 IE7、IE8 中无法正确呈现

    它们在 FF Safari 中看起来很棒 但社交媒体图标在 IE 中无法正确呈现 http www erisdesigns net STAGE ED1 3 http www erisdesigns net STAGE ED1 3 这是 IE
  • bean 的会话范围在 Spring MVC 应用程序中如何工作?

    我对 Spring MVC 还很陌生 我对会话范围一颗豆子 进入一个项目我有一个Cart豆子 这个 Component Scope value WebApplicationContext SCOPE SESSION proxyMode Sc
  • 找不到类型或命名空间名称“DbContext”[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我对 ASP NET MVC 3 非常陌生 并且很难解决 Visual Studio 中的构建错误 找不到类型或命名空间名称 DbCo
  • 了解 dFdX 和 dFdY 的基础知识

    我读过很多关于行为的描述dFdX n and dFdY n 并且相信我仍然能够掌握学校的偏导数 我不明白的是 在最简单的示例中 n 来自哪里 读取glsl内置函数dFdx n and dFdy n 除了数学之外 没有任何背景 我会将它们解释
  • 向下滚动时 RecyclerView 项目的值会重置

    这是我想要做的场景 我正在创建一个 RecyclerView 它可以添加或删除一个或多个具有 EditText 的子项目 片段 视图 但是 这是我的问题 每当我在 RecyclerView 中向下滚动时 其项目的值就会重置 我认为这里的问题