2010-06-17 18 views
2

我目前在Android中製作SMS應用程序,以下是Inbox Listactivity的代碼片段,我已經從contentresolver請求一個遊標並使用自定義適配器將自定義視圖添加到列表中。未知ListView行爲

現在,在自定義視圖我有2個TextViews(tvFullBodytvBody)... tvFullBody包含完整的SMS文本而tvBody包含一個簡短的預覽(35個字符) tvFullBody可視性默認設置爲GONE。

我的想法是,當一個列表項的用戶點擊,則tvBody應該dissappear(消失)和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); 
} 

代碼工作,因爲它應該只是不希望sideeffect到:) .... 每10名(或左右)列表項目也被「切換」。 例如。如果我展開第一個,那麼第11,21個列表項目也會展開...雖然它們仍然不在屏幕上,但在滾動時您會看到不希望的「擴展」。我試過Listview跟蹤當前可見的10個列表項,滾動時,它「重用」那些相同的變量,這是造成這個問題......(我沒有檢查Android的源代碼呢。) 我會爲任何建議gratefull,我應該如何解決這個問題! :) 我打開替代方法,以及....在此先感謝! :)

回答

1

您的診斷問題幾乎正確。發生什麼事是Android重複使用它創建的視圖來顯示列表以節省內存。 Android不會爲列表中的每個項目創建一個新的視圖,而只是創建足夠的空間來填充屏幕,更新它們以顯示當前可見項目的相關數據。

所以當你顯示tvFullBody當用戶點擊一個項目,當那個視圖被重新使用後,tvFullBody仍然可見。

您可能必須自己編寫ListAdapter以確保視圖按您的要求顯示。它應該像擴展您當前正在使用的ListAdapter一樣簡單,並覆蓋the getView() method以確保tvFullBody處於隱藏狀態。

+0

這是棘手的,但我設法讓它工作:)謝謝指出我在正確的方向! – st0le 2010-06-17 13:23:30