我正在使用当前的Android SDK,r15。
在我的项目中,我使用基于BaseAdapter的自定义适配器的ListViews。在BaseAdapter :: getView方法中,有一个视图,从xml资源中膨胀并自定义并填充文本;根据几个条件,背景颜色也会改变。这很有用,但是:
在Android 3.0及更高版本的Android虚拟设备(AVD)上,我遇到了问题,在某些时候,当Android尝试回收现有视图时,背景颜色不会改变,即使它在xml ressource。
我应该假设,这是Android模拟器的问题,或者可能是这也发生在真实设备上? 我从未在真实设备上看到过这个问题,使用相同的应用程序。
非抽象示例: 我有一个带登录布局的项目(几乎是白色,带有输入字段和一个按钮),一个“平板电脑” - 包含联系人列表视图和会话列表视图的布局;登录后,我可以选择一个联系人。在线联系人有绿色背景,离线联系人有白色背景。选择联系人后,联系人的背景变为红色。会话被加载到会话listView中。现在我注销了,现在可能是我以前的白色登录是绿色或红色,就像之前的联系人ListView一样。此外,甚至我的对话listView-Entries也可以继承联系人listView元素的颜色,忽略xml中指定的背景颜色。这似乎是随机的。
缩短的getView代码: (只是排除了设置'profileImage'的代码)
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = inflater.inflate(R.layout.contacts_listelement, parent, false);
int userId = contactList.get(position);
BackendStamp user = users.get(userId);
ImageView profileImage = (ImageView)view.findViewById(R.id.profilePicture);
TextView username = (TextView)view.findViewById(R.id.username);
TextView unreadMails = (TextView)view.findViewById(R.id.unreadMails);
ImageView userStatus = (ImageView)view.findViewById(R.id.userStatus);
if (user != null) {
if (user.getUnreadMails() == 0) {
unreadMails.setBackgroundResource(R.drawable.bgmessagesnull);
unreadMails.setTextColor(0xff000000);
}
else {
unreadMails.setBackgroundResource(R.drawable.bgmessagesnotnull);
unreadMails.setTextColor(0xffffffff);
}
if (user.getStatus() == 0) {
view.setBackgroundColor(0xFFFFFFFF);
}
else {
view.setBackgroundColor(0xFFEFFFD4);
}
// [...]
username.setText(user.getNickname());
unreadMails.setText("" + user.getUnreadMails());
// [...]
}
return view;
}
答案 0 :(得分:1)
试试这个代码段:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view;
if(convertView == null) {
view = inflater.inflate(R.layout.contacts_listelement, parent, false);
}
else {
view = convertView;
}
即使这不能解决您的问题,这对您的ListView
也有很好的性能提升。当Android尝试重新使用视图时,convertView
第一次为null
,然后它包含旧创建的视图,这些视图将重新循环并应该使用。