2012-07-22 47 views
1

我有一個listView,並希望當你按下它時展開每個項目。我有下面的代碼來做到這一點。我通過膨脹ViewStub工作。充氣到列表中的很多意見

它工作正常。也就是說,當我按下列表項時,確實會膨脹。到現在爲止還挺好。

但是,我的列表很長,我注意到當我向下滾動列表時,其他項目也膨脹了。我不完全確定爲什麼。當我再次向上滾動時,我原本按下的項目已經「放氣」,而其他一些項目卻變得膨脹了。

@override 
public void onListItemClick(ListView l, View v, int position, long id) { 


    ListView list = getListView(); 
    int start = list.getFirstVisiblePosition(); 
    for (int i = start, j = list.getLastVisiblePosition(); i <= j; i++) { 
     Cursor item = (Cursor) list.getItemAtPosition(i); 

     if (id == item.getLong(item.getColumnIndex(ItemColumns._ID))) { 
      View view = list.getChildAt(i - start); 

      ViewStub stub = (ViewStub) view.findViewById(R.id.stub); 
      if (stub != null) { 
       stub.inflate(); 

      }  
     } 
    } 
} 

任何幫助將不勝感激!

回答

1

Android重新使用ListView中的視圖。這就是爲什麼您的AdaptergetView(..)方法中有convertView。這個所謂後會解釋:ListView reusing views when ... I don't want it to 基本上你需要做的是保持項目的Set當前展開,並在您getView(..)方法進行查找:

if(mExpanded.contains(getItem(position))) { 
    //show expansion 
} else { 
    //hide expansion 
} 
onListItemClick方法

,那麼你要添加以下內容:

if(!mExpanded.remove(getListView().getItem(position))) { 
    mExpanded.add(getListView().getItem(position)); 
} 

這將導致它試圖刪除的項,如果Set沒有改變 - 這是項目沒有在Set被然後取出要添加它...