這篇文章將為大家詳細(xì)講解有關(guān)Android中RecyclerView顯示Item布局不一致怎么辦,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
創(chuàng)新互聯(lián)建站-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比濟(jì)水街道網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式濟(jì)水街道網(wǎng)站制作公司更省心,省錢(qián),快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋濟(jì)水街道地區(qū)。費(fèi)用合理售后完善,十余年實(shí)體公司更值得信賴。
RecyclerView顯示Item布局不一致
在自定義RecyclerAdapter的時(shí)候,在重寫(xiě)onCreateViewHolder方法是使用了
@Override public H onCreateViewHolder(ViewGroup parent, int viewType) { View view=View.inflate(context,layoutId,null); return view; }
進(jìn)行生成布局,結(jié)果發(fā)現(xiàn)生成的布局沒(méi)有LayoutParams。以前自定義View的時(shí)候發(fā)現(xiàn),LayoutParams是由于ViewGroup生成的,因?yàn)檫@里添加的ViewGroup為null。所以并不會(huì)生成LayoutParams。結(jié)果在RecyclerView的getViewForPosition方法中檢查了有沒(méi)有LayoutParams如果沒(méi)有的話就調(diào)用LayoutManager的generateDefaultLayoutParams生成默認(rèn)的LayoutParames。代碼段如下:
final ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams(); final LayoutParams rvLayoutParams; if (lp == null) { rvLayoutParams = (LayoutParams) generateDefaultLayoutParams(); holder.itemView.setLayoutParams(rvLayoutParams); } else if (!checkLayoutParams(lp)) { rvLayoutParams = (LayoutParams) generateLayoutParams(lp); holder.itemView.setLayoutParams(rvLayoutParams); } else { rvLayoutParams = (LayoutParams) lp; }
而在LinearLayoutManager中g(shù)enerateDefaultLayoutParams方法實(shí)現(xiàn)如下。
/** * {@inheritDoc} */ @Override public LayoutParams generateDefaultLayoutParams() { return new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); }
最終會(huì)造成RecycleView的顯示效果與布局文件不一致。后來(lái)使用了LayoutInflater來(lái)填充布局。
@Override public H onCreateViewHolder(ViewGroup parent, int viewType) { View view = mInflater.inflate(layoutId, parent, false); return getInstanceOfH(view); }
查看LayoutInflater源碼發(fā)現(xiàn)inflate最后的參數(shù)如果是false的話就不會(huì)將生成的View添加到parent。但是會(huì)根據(jù)parent產(chǎn)生相應(yīng)的LayoutParams 。源碼如下:
* @param attachToRoot Whether the inflated hierarchy should be attached to * the root parameter? If false, root is only used to create the * correct subclass of LayoutParams for the root view in the XML.
因?yàn)樵趏nCreateViewHolder中產(chǎn)生的View不能由我們手動(dòng)添加到RecycleView中所以最后的參數(shù)只能是false;
關(guān)于“Android中RecyclerView顯示Item布局不一致怎么辦”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。