Android ExpandableListView忘记更改的子文本视图
我有一个带有复选框的可扩展列表视图。当我单击一个子项时,会出现一个alertdialog,我选择数量,然后子项的textView会更改。但是当我向下滚动列表,这个孩子从视图中消失时,列表会忘记更改的文本视图,并设置旧的文本视图。原因是什么?ListView(及其子代ExpandableListView)不会永远创建和存储视图;相反,它会根据需要动态创建它们 设想一个场景,其中您有一个列表视图,其中包含1000个项目;但在给定时间,屏幕上只能看到任何5个项目的视图。您认为ListView会在屏幕上创建和维护1000个不同的视图吗?这将浪费内存,并可能导致UI延迟 相反,ListView在内部调用getView()函数来获取每个项目的视图,并将其显示在屏幕上。每次将项目带入屏幕显示时,它都会这样做,并且仅适用于在给定时间可以放入屏幕的大量项目(ListView在内部处理这些事情,因此您不必担心这一点) 您只需在相应的列表项中设置文本,并使用此文本填充getView()中的textview。维护一个文本字符串,并在作为项使用的任何对象类型中创建某种形式的getText()和settText(String)方法Android ExpandableListView忘记更改的子文本视图,android,checkbox,textview,expandablelistview,Android,Checkbox,Textview,Expandablelistview,我有一个带有复选框的可扩展列表视图。当我单击一个子项时,会出现一个alertdialog,我选择数量,然后子项的textView会更改。但是当我向下滚动列表,这个孩子从视图中消失时,列表会忘记更改的文本视图,并设置旧的文本视图。原因是什么?ListView(及其子代ExpandableListView)不会永远创建和存储视图;相反,它会根据需要动态创建它们 设想一个场景,其中您有一个列表视图,其中包含1000个项目;但在给定时间,屏幕上只能看到任何5个项目的视图。您认为ListView会在屏幕上
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
......//initialize text view for this position
Item item = getItem(position);
textView.setText(item.getText());
.......
}
通过alertDialog设置列表项中的文本后,在适配器上调用notifyDataSetChanged(),指示需要为当前显示的所有视图再次调用getView。
在侦听器中,传递对ListView适配器的引用。在alertDialog中设置数量时,只需使用
{
......
adapter.getItem(position).setText(quantityText);
adapter.notifyDataSetChanged();
......
}
第一行设置项目中的文本;第二行告诉适配器项目中的信息已更改,它需要再次创建视图。ListView(及其子代ExpandableListView)不会永远创建和存储视图;相反,它会根据需要动态创建它们
设想一个场景,其中您有一个列表视图,其中包含1000个项目;但在给定时间,屏幕上只能看到任何5个项目的视图。您认为ListView会在屏幕上创建和维护1000个不同的视图吗?这将浪费内存,并可能导致UI延迟
相反,ListView在内部调用getView()函数来获取每个项目的视图,并将其显示在屏幕上。每次将项目带入屏幕显示时,它都会这样做,并且仅适用于在给定时间可以放入屏幕的大量项目(ListView在内部处理这些事情,因此您不必担心这一点)
您只需在相应的列表项中设置文本,并使用此文本填充getView()中的textview。维护一个文本字符串,并在作为项使用的任何对象类型中创建某种形式的getText()和settText(String)方法
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
......//initialize text view for this position
Item item = getItem(position);
textView.setText(item.getText());
.......
}
通过alertDialog设置列表项中的文本后,在适配器上调用notifyDataSetChanged(),指示需要为当前显示的所有视图再次调用getView。
在侦听器中,传递对ListView适配器的引用。在alertDialog中设置数量时,只需使用
{
......
adapter.getItem(position).setText(quantityText);
adapter.notifyDataSetChanged();
......
}
第一行设置项目中的文本;第二行告诉适配器项目中的信息已更改,它需要再次创建视图。将可展开列表和代码放入单击列表中您需要将数量存储在列表中,以便每当重新创建视图时,它都会从列表项引用。还可以使用setTag和gettag您使用ViewHolder模式吗?“列表保持”会在列表项再次可见时重新创建列表项,因此您必须根据位置保存列表项,并在列表项已创建时加载它们,而不是让适配器再次创建它们。@Gil不,我不使用ViewHolder。我应该吗?是的。ViewHolder模式应为您提供对象/列表行项目的重用机制。这并不难,如果您需要帮助,请务必通知我。将可展开列表和代码放入单击列表中。您需要将数量存储在列表中,以便每当重新创建视图时,它都会从列表项引用。还可以使用setTag和gettag您使用ViewHolder模式吗?“列表保持”会在列表项再次可见时重新创建列表项,因此您必须根据位置保存列表项,并在列表项已创建时加载它们,而不是让适配器再次创建它们。@Gil不,我不使用ViewHolder。我应该吗?是的。ViewHolder模式应为您提供对象/列表行项目的重用机制。这并不难,如果您需要帮助,请务必通知我。在可扩展列表中,而不是getItem应该是getChild?我不确定,但我认为getItem()被getGroup()/getChild()替换,getView()分别被getGroupView()/getChildView()替换,取决于它是列表头还是子对象,在可扩展列表中而不是getItem中应该是getChild?我不确定,但我认为getItem()分别被getGroup()/getChild()替换,getView()分别被getGroupView()/getChildView()替换,这取决于它是列表头还是子对象