我试图在ListView中获取TextView和EditText的所有值,但我有一个奇怪的问题。这是我的示例代码,我删除了EditText以保持简单:
lv = (ListView) findViewById(R.id.person_details_lv);
Integer x = lv.getAdapter().getCount();
for (int i = 0; i < lv.getAdapter().getCount(); i++) {
View viewRow = lv.getChildAt(i);
//this next condition get the index of the view visible only
if (viewRow != null) {
TextView NameEditText = (TextView) viewRow.findViewById(R.id.detail_name);
Log.d("hello", "Anything detected onscreen:" + NameEditText.getText().toString() + ");
}}
问题是它只返回屏幕上可见的视图。但是,getCount
计算一切。结果,我收到此错误
显示java.lang.NullPointerException
我添加了这个条件:if (viewRow != null)
删除错误,但它一直只显示屏幕上的视图。当我滚动listView时,结果也会改变。我想要做的是获取ListView中TextViewe的值,无论是否在屏幕上看到。
答案 0 :(得分:1)
我认为你应该实现这个方法:
public View getViewByPosition(int pos, ListView listView) {
final int firstListItemPosition = listView.getFirstVisiblePosition();
final int lastListItemPosition = firstListItemPosition
+ listView.getChildCount() - 1;
if (pos < firstListItemPosition || pos > lastListItemPosition) {
return listView.getAdapter().getView(pos, null, listView);
} else {
final int childIndex = pos - firstListItemPosition;
return listView.getChildAt(childIndex);
}
}
然后通过重新启动:
来调用此方法View viewRow = lv.getChildAt(i);
使用:
viewRow= getViewByPosition(i, lv);
那就是它!你不需要改变其余的。只需删除此if (viewRow != null)
即可。我希望它有所帮助!
答案 1 :(得分:0)
因为你的listview项目中的所有视图都不是TextView类型,所以当你施放它们时,它们的som为null。 (将TextView以外的视图转换为TextView会生成null对象)
在转换之后,只检查它是否为null,如果它的null只是跳过它就是TextView。
在铸造后添加空条件!
答案 2 :(得分:-1)
您必须将Listview项存储在传递给适配器的List <>中。调用OnTextChanged时,必须存储EditText的值。 TextView值已在列表中可用。