【问题标题】:ExpandableListView forgets child changed textViewExpandableListView 忘记子更改的 textView
【发布时间】:2016-02-13 11:53:19
【问题描述】:

我有一个带有复选框的可扩展列表视图。当我单击一个孩子时,会出现一个警报对话框,然后我选择数量,然后孩子的 textView 会发生变化。但是当我向下滚动列表并且这个孩子从视图中消失时,列表忘记了更改的 textview 并设置了旧的。是什么原因?

【问题讨论】:

  • 将可扩展列表和代码放入您的点击监听器中
  • 您需要将数量存储在列表中,以便每当重新创建视图时,它都会从列表项中引用。并且还使用 setTag 和 getTag
  • 你使用 ViewHolder 模式吗?当列表项再次可见时,列表会不断重新创建您的列表项,因此您必须根据位置保存您的项目并在它们已经创建时加载它们,而不是让适配器再次创建它们。
  • @Gil 不,我不使用 ViewHolder。我应该吗?
  • 是的。 ViewHolder 模式应该为您提供对象/列表行项目的重用机制。这并不难,如果您需要帮助,请通知我。

标签: android checkbox textview expandablelistview


【解决方案1】:

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

想象一个场景,你有一个包含 1000 个项目的列表的 ListView;但是在给定时间只能在屏幕上看到任何 5 个项目的视图。你认为 ListView 会在屏幕上创建和维护 1000 个不同的视图吗?这会浪费内存,并可能导致 UI 滞后。

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

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

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

第一行设置item中的文本;第二行告诉适配器项目中的信息已经改变,它需要重新创建视图。

【讨论】:

  • 在可扩展列表中而不是 getItem 应该是 getChild?
  • 我不确定,但我认为 getItem() 被 getGroup()/getChild() 替换,getView() 分别被 getGroupView()/getChildView() 替换,这取决于它是否是列表标题或子项
猜你喜欢
  • 1970-01-01
  • 2017-05-01
  • 2016-04-10
  • 2012-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-19
  • 2016-07-18
相关资源
最近更新 更多