2011-05-26 22 views
7

我有一個listview,它被動態分配不同的數據集。這工作正常。我也讓fastScrollEnabled成爲true。對於sectionIndexer更新,我需要致電強制onSizeChanged爲ListView

list.setFastScrollEnabled(false); 
list.setFastScrollEnabled(true); 

問題是索引顯示在左上角,這是一個知道的問題。作爲解決方法,無論何時更改方向,索引都會再次正確顯示。爲了測試這個,我實現了一個自定義的ListView,觀察是如果我可以強制listView調用onSizeChanged()它會正常顯示。

現在的問題:

是否有可能迫使ListView控件調用onSizeChanged()方法?如果是的話我們如何才能做到這一點

有沒有人知道onSizeChanged()被調用時的條件。當方向改變,我們可以想到的任何其他條件時,它肯定會被調用。

回答

7

要強制onSizeChanged上的ListView我做了以下內容:

myList.getLayoutParams().height = myList.getHeight() + 1; 
myList.requestLayout(); 

只要確保不叫+1或-1,每次爲列表可能只是過度伸張指定大小,因此使用標誌在+1和-1之間切換。

+0

如果您已將高度設置爲FILL_PARENT,則這不起作用。如果你這樣做,然後改變方向,你將有不正確的高度。 – 2011-09-17 00:42:28

+0

這是一個破解快速滾動工作,當列表是動態的,並得到更新。 – PravinCG 2011-09-17 07:11:42

+0

感謝這解決了我長期堅持的問題 – reiley 2012-07-25 12:26:39

0

嘗試用:

listView.requestLayout(); 
+0

當列表實際顯示時,這並不會在第一次調用onSizeChanged時調用。 – PravinCG 2011-05-26 16:02:29

+0

然後我想最好的辦法是子類化ListView並手動調用它:) – Kamen 2011-05-26 16:07:31

0

這是我的解決方案:
我的子類的GridView與構造(上下文,AttributeSet中):
(這對我來說必須在一個單獨的文件類完成)
和overrided onSizeChanged方法

MyGrid.java 

public class MyGrid extends GridView { 

    public void MyGrid(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    // TODO Auto-generated constructor stub 
    } 

    protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
    // TODO Auto-generated method stub 
    // Here I call my custom functions to prepare layout of my custom listview 
    super.onSizeChanged(w, h, oldw, oldh); 
    } 
} 

在類活動比使用GridView,
我已override onStart方法
(在OnCreate和onRestart之後調用 [當你來自另一個活動])

MyActivity.java 

public class MyActivity extends Activity { 

    onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(...) 
    ... 
    } 
    .... 

    protected void onStart() { 
    // TODO Auto-generated method stub 

    // call db and create cursor 
    // 'mygridview' = findbyid MyGrid 
    // (declared on xml like '<packagepath>'.mygrid 

    // setadapter with my costom adapeter  

    // **HERE THE CALLED ONSIZECHANGED** 
    // I make test proper for my app 
    // (there is a simple test) 
    if ('mygridview'.getMeasuredHeight() > 0) { 
     // I use the same width and height for new and old measures 
     // because for me that is right 
     'mygridview'.onSizeChanged(gw.getWidth(), gw.getHeight(), 
         gw.getWidth(), gw.getHeight()); 
    } 
    super.onStart(); 
    } 
} 

使用這種方法,我可以隨時調整網格大小。 我希望這對你有所幫助。