ExpandableListView忘记了子项已更改的textView

时间:2015-11-12 07:58:10

标签: android checkbox textview expandablelistview

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

1 个答案:

答案 0 :(得分:0)

ListView(及其后代的ExpandableListView)不会永远创建和存储视图;相反,它会根据需要即时创建它们。

想象一下,你有一个ListView,其中包含一个包含1000个项目的列表;但是在给定时间,屏幕上只能显示任意5个项目的视图。你认为ListView会在屏幕上创建和维护1000个不同的视图吗?这将浪费内存,并可能导致用户界面滞后。

相反,ListView在内部调用getView()函数来获取每个项目的视图并在屏幕上显示它。每次将项目带入屏幕显示时都会执行此操作,并且仅适用于在给定时间可以放入屏幕的许多项目(ListView在内部处理这些内容,因此您不必担心这一点)

您需要做的就是在相应的列表项中设置文本,并使用此文本在getView()中填充textview。维护文本字符串并在您用作Item的任何Object类型中创建某种形式的getText()和setText(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。 在Listener中,传递对ListView适配器的引用。在alertDialog中设置数量时,只需使用

    {
    ......
    adapter.getItem(position).setText(quantityText);
    adapter.notifyDataSetChanged();
    ......
    }

第一行设置项目中的文本;第二行告诉适配器项目中的信息已更改,并且需要再次创建视图。