代码之家  ›  专栏  ›  技术社区  ›  st0le

未知的ListView行为

  •  2
  • st0le  · 技术社区  · 14 年前

    我目前正在Android中制作一个短信应用程序,下面是来自Inbox Listactivity的代码片段,我已经从contentresolver请求了一个游标,并使用了一个自定义适配器将自定义视图添加到列表中。

    现在,在自定义视图中,我有两个文本视图( , )... 包含完整的SMS文本 包含简短预览(35个字符) 这个 默认情况下,“可见性”设置为“消失”。

    电视主体 应该出现(消失)和 tv全身

    //isExpanded is a BitSet of the size = no of list items...keeps track of which items are expanded and which are not
    
    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
    
        if(isExpanded.get(position))
        {
            v.findViewById(R.id.tvFullBody).setVisibility(View.GONE);
            v.findViewById(R.id.tvBody).setVisibility(View.VISIBLE);
        }else
        {
            v.findViewById(R.id.tvFullBody).setVisibility(View.VISIBLE);
            v.findViewById(R.id.tvBody).setVisibility(View.GONE);
        }
        isExpanded.flip(position);
        super.onListItemClick(l, v, position, id);
    }
    

    代码按预期工作:)除了不希望的副作用。。。。 每10个左右的列表项也会被“切换”。 如果我展开第1个,那么第11个,第21个列表项也会展开…虽然它们保持在屏幕外,但是在滚动时你会看到不想要的“展开”。

    根据我的新手分析,我猜Listview会跟踪10个当前可见的列表项,在滚动时,它会“重用”那些相同的变量,这导致了这个问题……(我还没有检查android源代码) 我对其他方法也持开放态度……提前谢谢!:)

    1 回复  |  直到 14 年前
        1
  •  1
  •   David Webb    14 年前

    你对这个问题的诊断几乎是正确的。现在的情况是,Android正在重用它创建的视图来显示列表以节省内存。Android没有为列表中的每一个项目创建一个新的视图,而是创建一个足以填满屏幕的视图,更新它们以显示当前可见项目的相关数据。

    所以当你出现的时候 tvFullBody 当用户单击某个项目时,当该视图稍后被重新使用时

    你可能得自己写 ListAdapter 以确保视图按所需方式显示。它应该像扩展 the getView() method 为了确保 tv全身 是隐藏的。