您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關Android中RecyclerView顯示Item布局不一致怎么辦,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
RecyclerView顯示Item布局不一致
在自定義RecyclerAdapter的時候,在重寫onCreateViewHolder方法是使用了
@Override public H onCreateViewHolder(ViewGroup parent, int viewType) { View view=View.inflate(context,layoutId,null); return view; }
進行生成布局,結果發現生成的布局沒有LayoutParams。以前自定義View的時候發現,LayoutParams是由于ViewGroup生成的,因為這里添加的ViewGroup為null。所以并不會生成LayoutParams。結果在RecyclerView的getViewForPosition方法中檢查了有沒有LayoutParams如果沒有的話就調用LayoutManager的generateDefaultLayoutParams生成默認的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中generateDefaultLayoutParams方法實現如下。
/** * {@inheritDoc} */ @Override public LayoutParams generateDefaultLayoutParams() { return new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); }
最終會造成RecycleView的顯示效果與布局文件不一致。后來使用了LayoutInflater來填充布局。
@Override public H onCreateViewHolder(ViewGroup parent, int viewType) { View view = mInflater.inflate(layoutId, parent, false); return getInstanceOfH(view); }
查看LayoutInflater源碼發現inflate最后的參數如果是false的話就不會將生成的View添加到parent。但是會根據parent產生相應的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.
因為在onCreateViewHolder中產生的View不能由我們手動添加到RecycleView中所以最后的參數只能是false;
關于“Android中RecyclerView顯示Item布局不一致怎么辦”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。