RecyclerView如何設(shè)置背景圖片長(zhǎng)寬一樣

這篇文章主要介紹RecyclerView如何設(shè)置背景圖片長(zhǎng)寬一樣,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

10年的合川網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。營(yíng)銷型網(wǎng)站建設(shè)的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整合川建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)公司從事“合川網(wǎng)站設(shè)計(jì)”,“合川網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

使用RecyclerView的過程中,由于設(shè)置了LayoutManager的關(guān)系,控件(的background)往往不能通過指定長(zhǎng)寬為match_parent、wrap_content來實(shí)現(xiàn)長(zhǎng)寬大小相同。

面對(duì)的問題:

以指定GridLayout(Horizental)布局為例:控件的實(shí)際寬度受制于一行分割為幾列,粗略來說 寬度 = RecyclerView寬度 ÷ 列數(shù) 由于這個(gè)過程是運(yùn)行時(shí)確定的,長(zhǎng)度預(yù)先并不知道寬度的確切值,這會(huì)造成長(zhǎng)寬不匹配的現(xiàn)象(如圖)

RecyclerView如何設(shè)置背景圖片長(zhǎng)寬一樣

圖中l(wèi)ogo的寬度嚴(yán)格限制在GridLayout的每一小格的寬度范圍內(nèi),長(zhǎng)度(在沒有父控件的限制下)為初始值。

這里的初始值有兩個(gè)含義:

①在layout布局文件中指定了長(zhǎng)度為“xxdp”等確定值。

②長(zhǎng)度指定為“wrap_content” —— 當(dāng)背景為矢量圖,長(zhǎng)度為對(duì)應(yīng)drawable文件中確定的android:height ;當(dāng)背景為點(diǎn)陣圖,長(zhǎng)度為該圖分辨率的寬度。

這就使得我們看到的實(shí)際效果不是拉成了瘦瘦高高的長(zhǎng)竹竿,就是壓縮成了矮矮胖胖的矮冬瓜。

我們當(dāng)然可以在調(diào)試時(shí)得到控件寬度,再指定其為logo的長(zhǎng)度。這樣在調(diào)試機(jī)器上看起來確實(shí)長(zhǎng)寬相等了,但這真的解決了根本問題嗎?

我們的軟件要運(yùn)行在多種分辨率的屏幕下,死板的規(guī)定長(zhǎng)度必然使得在部分機(jī)型下長(zhǎng)寬失衡。

因此解決這個(gè)問題治標(biāo)治本的手段在于根據(jù)logo的實(shí)際寬度來確定長(zhǎng)度,令height = width。

怎么求寬度?

接下來就是如何獲取width的問題了。

根據(jù)上面的公式 寬度 = recyclerView的寬度 ÷ 列數(shù)且recyclerView寬度 = gridLayoutManager.getWidth();列數(shù) = gridLayoutManage.getSpanCount();

我們可以輕松獲得width = gridLayoutManager.getWidth()/gridLayoutManage.getSpanCount();

當(dāng)然,為了得到gridLayoutManager實(shí)例,我們需要將它作為RecyclerAdapter構(gòu)造方法中的參數(shù)傳入:

public RecyclerSysWebAdapter(Context context, ArrayList<IndexItem> list, 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的長(zhǎng)度為該值就行啦:

public void onBindViewHolder(SysWebHolder holder, final int position) { 
    ...//這里省略處理獲取button實(shí)例的代碼 
    ViewGroup.LayoutParams parm = holder.button_img.getLayoutParams(); //獲取button背景的LayoutParams實(shí)例 
    parm.height = glm.getWidth()/glm.getSpanCount() 
        - holder.button_img.getPaddingLeft(); 
}

在這里順便提一下LayoutParams類。該類通過指定width \ height 向父布局說明自己想要的尺寸信息,父布局將根據(jù)該信息盡可能滿足它。

好了,這樣一來我們成功的使得logo長(zhǎng)寬相等嘍!

還有一件事

你以為這樣就結(jié)束了?是不是還忘了點(diǎn)什么?

我們來看一下上述設(shè)置的實(shí)際效果:

RecyclerView如何設(shè)置背景圖片長(zhǎng)寬一樣

哎哎哎!雖然效果有改善,怎么還是長(zhǎng)方形的?!

靜下心仔細(xì)想一下,我們獲取的寬度真的是logo的寬度嗎?

RecyclerView如何設(shè)置背景圖片長(zhǎng)寬一樣

剛才算出來的值怎么看都像是①號(hào)距離啊喂!

我們?cè)谠O(shè)計(jì)布局時(shí)為了美觀往往需要對(duì)控件設(shè)置 marginpadding讓彼此間保持一定的距離。我們?cè)讷@取寬度時(shí)當(dāng)然也要考慮到這個(gè)因素了!

獲取margin的具體值代碼如下:

ViewGroup.LayoutParams parm = holder.button_img.getLayoutParams(); 
((ViewGroup.MarginLayoutParams)parm).leftMargin;

我們需要顯式地將 layoutParams 實(shí)例轉(zhuǎn)換為 MarginLayoutParams方能獲取作為成員變量margin值。

這里獲取margin值參考自這篇文章:http://blog.csdn.net/yunxiaoxiaoyun/article/details/22314407點(diǎn)擊打開鏈接

獲取padding代碼如下(默認(rèn)paddingLeft == paddingRight):

button.getPaddingLeft();

綜合起來代碼如下:

public void onBindViewHolder(SysWebHolder holder, final int position) { 
    ...//省略獲取button實(shí)例的代碼 
    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é)果:

RecyclerView如何設(shè)置背景圖片長(zhǎng)寬一樣

PS:差點(diǎn)忘了說,必須要注意的!

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));

請(qǐng)注意我的調(diào)用順序?yàn)樵趕etLayoutManager()之后再調(diào)用setAdapter()。

若調(diào)換兩語(yǔ)句順序會(huì)導(dǎo)致設(shè)置的長(zhǎng)度失效!

具體機(jī)理未深究,我猜測(cè)原因在于setLayoutManager()的過程中會(huì)再次測(cè)量并確定各控件的長(zhǎng)寬,覆蓋之前的設(shè)置。

以上是“RecyclerView如何設(shè)置背景圖片長(zhǎng)寬一樣”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

網(wǎng)頁(yè)標(biāo)題:RecyclerView如何設(shè)置背景圖片長(zhǎng)寬一樣
新聞來源:http://muchs.cn/article4/iiocie.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號(hào)、手機(jī)網(wǎng)站建設(shè)、、微信小程序、自適應(yīng)網(wǎng)站、軟件開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)