一般通過 ?item類型 ?判斷是否 ?頭部view, 從而占據(jù)一行顯示:
(recycleView內(nèi)部實(shí)現(xiàn)了復(fù)用view,是通過getViewType得到類型判斷是否復(fù)用還是調(diào)用adapter內(nèi)方法創(chuàng)建新的view,so不建議返回position,每次都返回不同值會(huì)喪失復(fù)用機(jī)制。)
RecyclerView有3個(gè)布局管理器:
1;LinearLayoutManager:
直接設(shè)置給RecyclerView,adapter中第一個(gè)item就是頭部View
mRecyclerView.setLayoutManager(newandroid.support.v7.widget.LinearLayoutManager(this,
android.support.v7.widget.LinearLayoutManager.VERTICAL,//縱向布局
false));//從第一個(gè)item開始顯示
2:GridLayoutManager
android.support.v7.widget.GridLayoutManager gridLayoutManager =newandroid.support.v7.widget.GridLayoutManager(this,3,android.support.v7.widget.GridLayoutManager.VERTICAL,false);
gridLayoutManager需要設(shè)置?setSpanSizeLookup,根據(jù)返回值決定該item占據(jù)幾列,當(dāng)前gridLayoutManager的列數(shù)是3,當(dāng)返回3時(shí)就占據(jù)了一行顯示。
gridLayoutManager.setSpanSizeLookup(newandroid.support.v7.widget.GridLayoutManager.SpanSizeLookup() {
@Override
public intgetSpanSize(intposition) {
returnposition ==0?3:1;
}
});
mRecyclerView.setLayoutManager(gridLayoutManager);
3;StaggeredGridLayoutManager
android.support.v7.widget.StaggeredGridLayoutManager staggeredGridLayoutManager =newandroid.support.v7.widget.StaggeredGridLayoutManager(3,android.support.v7.widget.StaggeredGridLayoutManager.VERTICAL);
mRecyclerView.setLayoutManager(staggeredGridLayoutManager);
設(shè)置了staggeredGridLayoutManager后需要在其adapter重寫一個(gè)方法onViewAttachedToWindow
@Override
public voidonViewAttachedToWindow(android.support.v7.widget.RecyclerView.ViewHolder holder) {
super.onViewAttachedToWindow(holder);
android.view.ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams();
if( lp ?!= null && ?lp ?instanceof ?android.support.v7.widget.StaggeredGridLayoutManager.LayoutParams) {
android.support.v7.widget.StaggeredGridLayoutManager.LayoutParams p = (android.support.v7.widget.StaggeredGridLayoutManager.LayoutParams) lp;
? ? ? ? ? /*主要代碼 是 setFullSpan ,為true占據(jù)一行。網(wǎng)上有些帖子也是用這個(gè)方法,但是是重寫StaggeredGridLayoutManager,在其onMeasure使用setFullSpan,有的在adapter的onBindViewHolder使用setFullSpan,但是我運(yùn)行測(cè)試過有bug:不止第一個(gè)item占據(jù)一行,有時(shí)第一個(gè)item寬度很小,但是占據(jù)一行的情況。*/
? ? ? ? ? p.setFullSpan(holder.getLayoutPosition() ==0?true:false);
}
}