【问题标题】:recyclerView.getChildCount() is returning different number of child everytimerecyclerView.getChildCount() 每次都返回不同数量的孩子
【发布时间】:2021-11-22 05:24:11
【问题描述】:

我创建了一个包含动态EditText 字段的RecyclerView。当EditText 字段中的值被编辑时,我需要通过单击按钮来保存它们。我正在使用recyclerView.getChildCount() 来获取每次都给出不同数字的孩子计数。

【问题讨论】:

    标签: android android-recyclerview expandablerecyclerview


    【解决方案1】:

    RecyclerView 执行其名称所指示的操作。它回收视图。假设您有一个包含 1000 个条目的列表,但在任何给定时间,屏幕上都会显示 3-4 个条目。 RecyclerView 的适配器始终拥有所有这些子节点,因此调用 recyclerView.getAdapter().getItemCount(); 将返回 1000。

    但是,RecyclerView 仅保存一些已显示且“接近”显示的项目,因此 recyclerView.getChildCount() 将返回一个较小且不恒定的值。对于大多数应用程序,您应该使用适配器提供的方法。

    【讨论】:

    • @Shivani 。如果我帮助了你,别忘了接受答案。
    • 感谢@spork 回答我的问题。我试过使用 recyclerView.getAdapter().getItemCount();但由此我无法获得在 recyclerview 中编辑的值。我只会得到一些项目。我正在使用 recyclerView.getChildAt(index) 获取子视图。
    • 如果您不需要 RV 的回收功能,切换到 ListView 可能会更容易。如果您需要获取某些项目,我建议您使用适配器的findViewByPosition(int position); 它返回给定位置的视图,如果不存在则返回 null。请注意,它也遵循ignoreView 规范。你可以在这里阅读:developer.android.com/reference/android/support/v7/widget/…
    • 你的意思是布局管理器的 findViewByPosition(int position); ?
    • 它抛出一个 NullPointerException。
    【解决方案2】:

    您所说的 RecyclerView 的子代是指行数?

    那我建议调用适配器的方法。调用:

    recyclerView.getAdapter().getItemCount();
    

    【讨论】:

    • 是的,我指的是行数。
    • 但是如果我想从 recyclerView 的单行获取值,这将不起作用。
    【解决方案3】:

    我想您正在使用 LinearLayoutManager 来显示列表。它有一个名为 findViewByPosition 的好方法

    【讨论】:

      【解决方案4】:

      问题发布比较晚。不要认为答案正确地解决了问题。 “getChildCount under reporting visible items displayed”的问题被报告几年后,但我的研究发现没有人指出在某些情况下导致此问题浮出水面的原因。

      我最近遇到了同样的问题,这导致我进一步调查。这是我的发现。

      如果 RecyclerView 上的 9 个项目可见。调用 getChildCount()。它应该返回 9,可能会少/多 1 或 2,具体取决于顶部和底部的部分可见项目。这将是大多数时间的结果......直到软键盘显示一些 TextEdit 输入。如果在导致显示键盘的方法调用之后大约 500 毫秒调用 getChildCount(),结果将小于 9。它将是不受键盘视图阻碍的项目的计数。奇怪的是,即使用户没有更改 RecyclerView 的显示内容。奇怪的是,即使在关闭键盘之后,所有 9 个项目都再次可见,调用 getChildCount() 仍然会返回不正确的计数不足!这发生在 Android 11 上,并且可能发生在 pre-11s 上(没有在 post-11s 上测试过)。

      解决这个问题的一个线索是 RecyclerView.postInvalidateDelayed 方法。如果您确实需要使用正确的 getChildCount 数字,请执行以下操作(在键盘关闭后):

         myRecyclerView.invalidate();
         myRecyclerView.postDelayed(myRunnable, 200); 
      

      微妙的问题!

      Google 的 Android 人员 .. 请注意并解决此错误。

      【讨论】:

        【解决方案5】:

        LayoutManager 中有一个名为getItemCount() 的方法,它可以准确返回您需要的内容。基本上它会执行其他答案中建议的操作。

        【讨论】:

          【解决方案6】:

          嘿,如果我正确理解了您的问题,您正在尝试在按钮单击时检索 EditText 中的值。 如果您想从所有可见的视图持有者中检索,请执行此操作

          View v;
          int itemCount = recyclerview.getChildCount();
          for(int i = 0; i < itemCount; i++){
              v = recyclerview.getChildAt(i); /* assuming you have your EditText in a view group like LinearLayout*/
              EditText et = v.findViewById(R.id.my_text);
              String text = et.getText().toString()
              // todo process text
          }
          

          【讨论】:

            猜你喜欢
            • 2019-02-26
            • 2021-06-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-02-16
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多