android - 未知的 ListView 行为

标签 android listactivity

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

现在,在自定义 View 中我有 2 个 TextView(tvFullBodytvBody)... tvFullBody 包含完整的 SMS 文本,而 tvBody 包含简短预览(35 个字符) tvFullBody 可见性默认设置为“消失”。

我的想法是,当用户单击列表项时,tvBody 应该消失 (GONE) 而 tvFullBody 应该变得可见 (VISIBLE)。再次点击时,它应该恢复到原来的状态。

//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 个(左右)列表项也会被“切换”。 例如。如果我展开第一个,那么第 11 个、第 21 个列表项也会展开...虽然它们仍然不在屏幕上,但在滚动时您会看到不需要的“展开”。

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

最佳答案

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

因此,当您在用户点击某个项目时显示 tvFullBody 时,当稍后重新使用该 View 时,tvFullBody 仍然可见。

您可能必须编写自己的 ListAdapter 以确保 View 以您想要的方式显示。它应该像扩展您当前使用的 ListAdapter 一样简单,并覆盖 the getView() method。确保隐藏 tvFullBody

关于android - 未知的 ListView 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3059807/

相关文章:

android - 条码扫描器无结果

java.lang.NoClassDefFoundError : android. support.v4.preferencefragment.R$layout

android - 在数据绑定(bind)方法引用中传递 View ID 或引用

java - ImageView,选择某部分Android

android - 如何从 AsyncTask 返回数据到主线程

java - Android ListActivity : onCreate is called every time after screen rotation, 所选项目重置,但视觉上仍保持选中状态

java - 如何在 android 小部件中设置泰米尔语文本?

android - Firebase Phone Auth 不发送带有代码的短信

ListActivity 中的 AndroidAnnotations 和上下文菜单

android - 如何从 contextMenu 访问 ListItem 位置