如果大家有使用過GridLayout來給RecyclerView使用,會發現其實是沒有居中的,而官方也沒有給出居中的方法,這里就講講如何讓其居中。
要做的這一點其實很簡單,只要我們自己計算每一個item的寬度即可。例如三列的結構,如果在寬度較小的情況下,會靠在左邊顯示,導致不居中,我們也不可能自己對著屏幕測量然后在xml中設置合適的寬度,這些工作應該由代碼來為我們完成。由代碼計算出合適的寬度值,然后賦予我們的item,這樣item的寬度相同并且平分了屏幕就完成了居中的效果。
看了上面的原理,所以實現居中有兩個操作,第一個是我們能夠設置item的寬度,第二個是計算item的寬度。我們先來進行設置寬度的代碼編寫。
對于item的管理,我們都知道是適配器完成的,所以對于寬度的管理我們也是在適配器中實現的。在設配器中定義一個私有變量 mItemWidth ,用于保存item的寬度,當我們計算完item的寬度后,來保存在這個變量中。對于一個item的寬度改變應該怎么做?很顯然,是使用LayoutParams來動態改變item的寬度。那應該在哪修改呢?對適配器熟悉的同學,應該就會馬上意識到在 onCreateViewHolder 這一函數中修改即可。
這樣的話,動態設置item的寬度,我們就完成了。
這一步很簡單,只用四則運算就可以了,但是有一個地方需要注意。我們只用在給recyclerview設置適配器的時候,調用適配器setItemWidth 函數并傳入item的寬度值即可。
但是,有些同學會發現使用了之后,沒有效果。如果出現了沒有效果的情況,可以嘗試輸出recyclerview.getWidth的值,如果是0的話,就明白了。寬度高度為0,這怎么可能?事實上,如果遇到這種情況的同學就會明白,是因為控件還沒有還沒有完成繪制,你必須等待系統將繪制完View時,才能獲得。
那應該如果獲得到寬度呢?有幾個方法,這里我只介紹我覺得最簡單的一種方法:將一個runnable添加到Layout隊列中:View.post()。因為runnable對象中的方法會在view的measure、layout等事件后觸發。所以我們只用在runnable中設置適配器即可。
recyclerview.post(new Runnable() { @Override public void run() { GridLayoutManager layoutManager = new GridLayoutManager(mContext, columns); routeItems.setLayoutManager(layoutManager); Adapter adapter = new RoutesAdapter(array); adapter.setItemWidth((int) ((recyclerview.getWidth()) / columns)); recyclerview.setAdapter(adapter); } });其他方法可以參考:http://www.cnblogs.com/kissazi2/p/4133927.html
這樣的話,居中就大功告成了。
新聞熱點
疑難解答