2011-12-03 66 views
0

我使用的是當前的Android SDK r15。android虛擬設備 - 視圖有奇怪的背景顏色

在我的項目中,我使用基於BaseAdapter的自定義適配器的ListViews。在BaseAdapter :: getView方法中,存在一個視圖,從xml資源中誇大並定製並填充文本;背景顏色也會根據幾種情況而改變。這很好,但:

在Android 3.0及更高版本的Android虛擬設備(AVD)上,我遇到了問題,在某些時候,當Android試圖回收現有視圖時,背景顏色不會即使它是在xml資源中指定的。

我假設,這是一個android模擬器的問題,或者它可能會發生在真實設備上? 我從來沒有在真實的設備上看到這個問題,但是使用相同的應用程序。

非抽象示例: 我有一個帶登錄佈局(幾乎是白色的,帶有輸入字段和按鈕)的項目,包含聯繫人列表視圖和對話列表視圖的「平板電腦」佈局 - 登錄後,我可以選擇一個聯繫人。在線聯繫人已獲得綠色背景,脫機聯繫人爲白人。選擇聯繫人後,聯繫人的背景變爲紅色。對話被加載到對話列表視圖中。現在我註銷了,現在可能是我以前的白色登錄名是綠色或紅色,就像之前的聯繫人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

你可以把'getView'函數的代碼? – havexz

+0

我編輯了這個問題,現在包括'getView'的代碼。 – pmedia

回答

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,然後它包含舊的創建視圖,這些視圖將被重新循環並應該被使用。

+0

感謝您的改進:) – pmedia

+0

它能解決您的問題嗎? – havexz

+0

沒有。具有損壞背景顏色的視圖通過setContentView(R.layout。[...])獲取到不同位置。 – pmedia