這篇文章主要介紹RecyclerView如何設(shè)置背景圖片長寬一樣,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
成都創(chuàng)新互聯(lián)是一家專業(yè)提供西藏企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)、H5網(wǎng)站設(shè)計、小程序制作等業(yè)務(wù)。10年已為西藏眾多企業(yè)、政府機構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站制作公司優(yōu)惠進行中。使用RecyclerView的過程中,由于設(shè)置了LayoutManager的關(guān)系,控件(的background)往往不能通過指定長寬為match_parent、wrap_content來實現(xiàn)長寬大小相同。
面對的問題:
以指定GridLayout(Horizental)布局為例:控件的實際寬度受制于一行分割為幾列,粗略來說 寬度 = RecyclerView寬度 ÷ 列數(shù) 由于這個過程是運行時確定的,長度預(yù)先并不知道寬度的確切值,這會造成長寬不匹配的現(xiàn)象(如圖)
圖中l(wèi)ogo的寬度嚴格限制在GridLayout的每一小格的寬度范圍內(nèi),長度(在沒有父控件的限制下)為初始值。
這里的初始值有兩個含義:
①在layout布局文件中指定了長度為“xxdp”等確定值。
②長度指定為“wrap_content” —— 當背景為矢量圖,長度為對應(yīng)drawable文件中確定的android:height ;當背景為點陣圖,長度為該圖分辨率的寬度。
這就使得我們看到的實際效果不是拉成了瘦瘦高高的長竹竿,就是壓縮成了矮矮胖胖的矮冬瓜。
我們當然可以在調(diào)試時得到控件寬度,再指定其為logo的長度。這樣在調(diào)試機器上看起來確實長寬相等了,但這真的解決了根本問題嗎?
我們的軟件要運行在多種分辨率的屏幕下,死板的規(guī)定長度必然使得在部分機型下長寬失衡。
因此解決這個問題治標治本的手段在于根據(jù)logo的實際寬度來確定長度,令height = width。
怎么求寬度?
接下來就是如何獲取width的問題了。
根據(jù)上面的公式 寬度 = recyclerView的寬度 ÷ 列數(shù)且recyclerView寬度 = gridLayoutManager.getWidth();列數(shù) = gridLayoutManage.getSpanCount();
我們可以輕松獲得width = gridLayoutManager.getWidth()/gridLayoutManage.getSpanCount();
當然,為了得到gridLayoutManager實例,我們需要將它作為RecyclerAdapter構(gòu)造方法中的參數(shù)傳入:
public RecyclerSysWebAdapter(Context context, ArrayListlist, OnItemClickListener listener,GridLayoutManager glm) { this.list = list; this.context = context; this.listener = listener; this.glm = glm; }
recyclerView調(diào)用方代碼如下:
GridLayoutManager glm_sys = new GridLayoutManager(getContext(),7);//分為7列 recycler_sys.setLayoutManager(glm_sys); //設(shè)置布局管理器 recycler_sys.setAdapter(new RecyclerSysWebAdapter(getContext(),item_list_sys,onItemClickListener_sys,glm_sys));
接下來就是在RecyclerAdapter中指定logo的長度為該值就行啦:
public void onBindViewHolder(SysWebHolder holder, final int position) { ...//這里省略處理獲取button實例的代碼 ViewGroup.LayoutParams parm = holder.button_img.getLayoutParams(); //獲取button背景的LayoutParams實例 parm.height = glm.getWidth()/glm.getSpanCount() - holder.button_img.getPaddingLeft(); }
在這里順便提一下LayoutParams類。該類通過指定width \ height 向父布局說明自己想要的尺寸信息,父布局將根據(jù)該信息盡可能滿足它。
好了,這樣一來我們成功的使得logo長寬相等嘍!
還有一件事
你以為這樣就結(jié)束了?是不是還忘了點什么?
我們來看一下上述設(shè)置的實際效果:
哎哎哎!雖然效果有改善,怎么還是長方形的?!
靜下心仔細想一下,我們獲取的寬度真的是logo的寬度嗎?
剛才算出來的值怎么看都像是①號距離啊喂!
我們在設(shè)計布局時為了美觀往往需要對控件設(shè)置 margin 及padding 讓彼此間保持一定的距離。我們在獲取寬度時當然也要考慮到這個因素了!
獲取margin的具體值代碼如下:
ViewGroup.LayoutParams parm = holder.button_img.getLayoutParams(); ((ViewGroup.MarginLayoutParams)parm).leftMargin;
我們需要顯式地將 layoutParams 實例轉(zhuǎn)換為 MarginLayoutParams方能獲取作為成員變量margin值。
這里獲取margin值參考自這篇文章:http://blog.csdn.net/yunxiaoxiaoyun/article/details/22314407點擊打開鏈接
獲取padding代碼如下(默認paddingLeft == paddingRight):
button.getPaddingLeft();
綜合起來代碼如下:
public void onBindViewHolder(SysWebHolder holder, final int position) { ...//省略獲取button實例的代碼 ViewGroup.LayoutParams parm = holder.button_img.getLayoutParams(); parm.height = glm.getWidth()/glm.getSpanCount() - 2*holder.button_img.getPaddingLeft() - 2*((ViewGroup.MarginLayoutParams)parm).leftMargin;//margin為什么要乘以2留給你們思考一下 }
現(xiàn)在問題徹底解決啦!我們觀察一下結(jié)果:
PS:差點忘了說,必須要注意的!
recycler_sys = act.findViewById(R.id.recycler_sys_website); GridLayoutManager glm_sys = new GridLayoutManager(getContext(),sys_column); recycler_sys.setLayoutManager(glm_sys); recycler_sys.setAdapter(new RecyclerSysWebAdapter(getContext() ,item_list_sys,onItemClickListener_sys,glm_sys));
請注意我的調(diào)用順序為在setLayoutManager()之后再調(diào)用setAdapter()。
若調(diào)換兩語句順序會導致設(shè)置的長度失效!
具體機理未深究,我猜測原因在于setLayoutManager()的過程中會再次測量并確定各控件的長寬,覆蓋之前的設(shè)置。
以上是“RecyclerView如何設(shè)置背景圖片長寬一樣”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!