我目前正在Android中创建一个SMS应用程序,以下是来自Inbox Listactivity的代码片段,我已经从contentresolver请求了一个游标,并使用自定义适配器将自定义视图添加到列表中。
现在,在自定义视图中我有2个TextViews( tvFullBody , tvBody )... tvFullBody 包含完整短信文本,而 tvBody 包含简短预览(35个字符) 默认情况下, tvFullBody 可见性设置为GONE。
我的想法是,当用户点击列表项时, 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个(左右)列表项也会“切换”。 例如。如果我展开第1个,那么第11个,第21个列表项也会被展开......虽然它们仍然在屏幕外,但在滚动时你会看到不希望的“扩展”。
通过我的新手分析,我猜测Listview跟踪当前可见的10个列表项,在滚动时,它“重用”那些相同的变量,这导致了这个问题...(我没有检查android源代码。) 我会感激任何关于如何解决这个问题的建议! :) 我对其他方法持开放态度......提前谢谢! :)
答案 0 :(得分:1)
您对问题的诊断几乎是正确的。发生的事情是,Android正在重复使用它创建的视图来显示列表以节省内存。 Android创建的内容足以填满屏幕,更新它们以显示当前可见项目的相关数据,而不是为列表中的每个项目创建新视图。
因此,当您在用户点击某个项目时显示tvFullBody
时,稍后重新使用该视图时,tvFullBody
仍然可见。
您可能必须自己编写ListAdapter
以确保以您希望的方式显示视图。它应该像扩展您当前使用的ListAdapter
并覆盖the getView()
method一样简单,以确保隐藏tvFullBody
。