Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android ExpandableListView忘记更改的子文本视图_Android_Checkbox_Textview_Expandablelistview - Fatal编程技术网

Android ExpandableListView忘记更改的子文本视图

Android ExpandableListView忘记更改的子文本视图,android,checkbox,textview,expandablelistview,Android,Checkbox,Textview,Expandablelistview,我有一个带有复选框的可扩展列表视图。当我单击一个子项时,会出现一个alertdialog,我选择数量,然后子项的textView会更改。但是当我向下滚动列表,这个孩子从视图中消失时,列表会忘记更改的文本视图,并设置旧的文本视图。原因是什么?ListView(及其子代ExpandableListView)不会永远创建和存储视图;相反,它会根据需要动态创建它们 设想一个场景,其中您有一个列表视图,其中包含1000个项目;但在给定时间,屏幕上只能看到任何5个项目的视图。您认为ListView会在屏幕上

我有一个带有复选框的可扩展列表视图。当我单击一个子项时,会出现一个alertdialog,我选择数量,然后子项的textView会更改。但是当我向下滚动列表,这个孩子从视图中消失时,列表会忘记更改的文本视图,并设置旧的文本视图。原因是什么?

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();
    ......
    }
第一行设置项目中的文本;第二行告诉适配器项目中的信息已更改,它需要再次创建视图。

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()替换,这取决于它是列表头还是子对象