【发布时间】:2021-11-22 05:24:11
【问题描述】:
我创建了一个包含动态EditText 字段的RecyclerView。当EditText 字段中的值被编辑时,我需要通过单击按钮来保存它们。我正在使用recyclerView.getChildCount() 来获取每次都给出不同数字的孩子计数。
【问题讨论】:
标签: android android-recyclerview expandablerecyclerview
我创建了一个包含动态EditText 字段的RecyclerView。当EditText 字段中的值被编辑时,我需要通过单击按钮来保存它们。我正在使用recyclerView.getChildCount() 来获取每次都给出不同数字的孩子计数。
【问题讨论】:
标签: android android-recyclerview expandablerecyclerview
RecyclerView 执行其名称所指示的操作。它回收视图。假设您有一个包含 1000 个条目的列表,但在任何给定时间,屏幕上都会显示 3-4 个条目。 RecyclerView 的适配器始终拥有所有这些子节点,因此调用 recyclerView.getAdapter().getItemCount(); 将返回 1000。
但是,RecyclerView 仅保存一些已显示且“接近”显示的项目,因此 recyclerView.getChildCount() 将返回一个较小且不恒定的值。对于大多数应用程序,您应该使用适配器提供的方法。
【讨论】:
findViewByPosition(int position); 它返回给定位置的视图,如果不存在则返回 null。请注意,它也遵循ignoreView 规范。你可以在这里阅读:developer.android.com/reference/android/support/v7/widget/…
您所说的 RecyclerView 的子代是指行数?
那我建议调用适配器的方法。调用:
recyclerView.getAdapter().getItemCount();
【讨论】:
我想您正在使用 LinearLayoutManager 来显示列表。它有一个名为 findViewByPosition 的好方法
【讨论】:
问题发布比较晚。不要认为答案正确地解决了问题。 “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 人员 .. 请注意并解决此错误。
【讨论】:
LayoutManager 中有一个名为getItemCount() 的方法,它可以准确返回您需要的内容。基本上它会执行其他答案中建议的操作。
【讨论】:
嘿,如果我正确理解了您的问题,您正在尝试在按钮单击时检索 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
}
【讨论】: