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

现在,在自定义视图中,我有2个TextViews(tvFullBody,tvBody)...
tvFullBody包含完整的短信文本,而tvBody包含简短预览(35个字符)
默认情况下,tvFullBody可见性设置为GONE。

我的想法是,当用户单击列表项时,tvBody应该消失(消失)并且tvFullBody应该变得可见(可见)。再次单击时,它应恢复为原始状态。

//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);
}


该代码按预期的方式工作:)除了不希望的副作用之外。
每十个(或大约)列表项也会被“切换”。
例如。如果我展开第一个,则第11个,第21个列表项也会被展开...尽管它们不在屏幕上,但是在滚动时,您会看到不需要的“展开”。

根据我的新手分析,我猜测Listview会跟踪当前可见的10个列表项,滚动时会“重用”这些相同的变量,这导致了此问题...(我没有检查android源代码然而。)
对于我应该如何解决这个问题的任何建议,我将不胜感激! :)
我也愿意接受其他方法。。。谢谢! :)

最佳答案

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

因此,当用户单击某个项目时显示tvFullBody时,以后再次使用该视图时,仍然可以看到tvFullBody

您可能必须编写自己的ListAdapter以确保按所需方式显示视图。它应该像扩展当前正在使用的ListAdapter并覆盖the getView() method以确保tvFullBody被隐藏一样简单。

09-27 12:48