ecyclerview根據setSpanSizeLookup實現復雜布局(不用嵌套)


 

我們知道實現recyclerview復雜布局,可以用recyclerview嵌套可以實現。

注:具體使用嵌套還是本文介紹的這種方法,需要根據項目的需求來確定
本文主要說可以根據布局管理器GridLayoutManager的setSpanSizeLookup方法來動態控制。后面具體介紹。

看下setSpanSizeLookup源碼:

/** 設置源獲取適配器中每個item占用的跨度數。
* Sets the source to get the number of spans occupied by each item in the adapter.
*
*用於查詢跨越數的實例 每個item占用
* @param spanSizeLookup {@link SpanSizeLookup} instance to be used to query number of spans
*
* occupied by each item
*/
public void setSpanSizeLookup(SpanSizeLookup spanSizeLookup) {
mSpanSizeLookup = spanSizeLookup;
}
1
2
3
4
5
6
7
8
9
10
11
首先我們需要重寫兩個方法
getItemViewType(int position)和 onAttachedToRecyclerView(RecyclerView recyclerView)
@Override
public int getItemViewType(int position) {
/**
* 根據position設置我們需要的itemtype
* */
//例如:
if (position==0){
return TYPE_SLIDER;//輪播圖
}

}
1
2
3
4
5
6
7
8
9
10
11
onAttachedToRecyclerView:

@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);

RecyclerView.LayoutManager manager = recyclerView.getLayoutManager();
if (manager instanceof GridLayoutManager) {
final GridLayoutManager gridManager = ((GridLayoutManager) manager);
gridManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {

/**
* 根據GridLayoutManager的getSpanSize方法可以動態的設置item跨列數
* 需要設置:4個參數的GridLayoutManager
* new GridLayoutManager(getActivity(),6,GridLayoutManager.VERTICAL,false);
* 這里的6(自己設置的最好設置成偶數)就相當於分母,6默認顯示一整行(1列),下面的3 和2 就相當於分子,返回3就是(1/2)所以此類型對應的是2列,返回2就是(1/3)所以此類型對應的是3列
* */
//例如:根據getItemViewType返回的itemtype,第一個position顯示為輪播圖,所以返回的是gridManager.getSpanCount();(即:6)
int type = getItemViewType(position);
switch (type) {
case TYPE_SLIDER:
//這里的輪播圖類型和head 返回默認的spansize(即是6)
return gridManager.getSpanCount();
//如果要顯示兩列就返回3 3除以6 二分之一
}
}
});
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
setSpanSizeLookup:這個方法,在上面的源碼中我們可以看到,主要是控制每個item占用的跨度數

奉上適配器完整代碼
/**
* Created by sswl on 2017/5/3.
*/

public class OneAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements BaseSliderView.OnSliderClickListener{

public static final int TYPE_SLIDER = 0x001;
public static final int TYPE_TYPE2_HEAD = 0x002;
public static final int TYPE_TYPE2 = 0x003;
public static final int TYPE_TYPE3_HEAD = 0x004;
public static final int TYPE_TYPE3 = 0x005;
public static final int TYPE_TYPE4 = 0x006;

private Context mCtx;
private final LayoutInflater inflater;

public OneAdapter(Context mCtx){
this.mCtx=mCtx;
inflater = LayoutInflater.from(mCtx);

}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch (viewType){
case TYPE_SLIDER://輪播圖
return new SliderViewHolder(inflater.inflate(R.layout.slider_type,parent,false));
case TYPE_TYPE2_HEAD:
case TYPE_TYPE3_HEAD://head 頭布局
return new HeadViewHolder(inflater.inflate(R.layout.headtitle_item,parent,false));
case TYPE_TYPE2:
case TYPE_TYPE3:
case TYPE_TYPE4:
return new TypeViewHolder(inflater.inflate(R.layout.one_item_type_1,parent,false));
default:
return null;
}
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (holder instanceof SliderViewHolder){
bindItemTypeSlider((SliderViewHolder) holder, position);
}else if (holder instanceof HeadViewHolder){
bindType1Head((HeadViewHolder) holder, position);
}else if (holder instanceof TypeViewHolder){
bindType1((TypeViewHolder) holder, position);
}

}

private void bindType1(TypeViewHolder holder, int position) {

}

private void bindType1Head(HeadViewHolder holder, int position) {
}

/**
* 實現輪播圖
* */
private void bindItemTypeSlider(SliderViewHolder holder, int position) {
//這里可以進行網絡操作
HashMap<String,String> url_maps = new HashMap<String, String>();
url_maps.put("輪播圖1", "http://static2.hypable.com/wp-content/uploads/2013/12/hannibal-season-2-release-date.jpg");
url_maps.put("輪播圖2", "http://cdn3.nflximg.net/images/3093/2043093.jpg");
url_maps.put("輪播圖3", "http://images.boomsbeat.com/data/images/full/19640/game-of-thrones-season-4-jpg.jpg");
for(String name : url_maps.keySet()){
DefaultSliderView sliderView = new DefaultSliderView(mCtx);
// TextSliderView textSliderView = new TextSliderView(this);
sliderView
.description(name)
.image(url_maps.get(name))
.setScaleType(BaseSliderView.ScaleType.Fit).setOnSliderClickListener(this);

//add your extra information 點擊圖片時可用到
sliderView.bundle(new Bundle());
sliderView.getBundle()
.putString("extra",name);
holder.slider.setDuration(4000);
holder.slider.addSlider(sliderView);
}
}

@Override
public int getItemCount() {
return 41;
}

@Override
public int getItemViewType(int position) {
/**
* 指定position顯示返回對應的itemType
* */
if (position==0){
return TYPE_SLIDER;
}else if(position==1){
return TYPE_TYPE2_HEAD;
}else if(position>=2 && position<=7){
return TYPE_TYPE2;
}else if(position==8){
return TYPE_TYPE3_HEAD;
}else if(position>=9 && position<=14){
return TYPE_TYPE3;
}else if (15<=position && position <= 18){
return TYPE_TYPE4;
}else {
return TYPE_TYPE2;
}
}

@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
RecyclerView.LayoutManager manager = recyclerView.getLayoutManager();
if (manager instanceof GridLayoutManager) {
final GridLayoutManager gridManager = ((GridLayoutManager) manager);
gridManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
int type = getItemViewType(position);
/**
* 根據GridLayoutManager的getSpanSize方法可以動態的設置item跨列數
* 需要設置:4個參數的GridLayoutManager
* new GridLayoutManager(getActivity(),6,GridLayoutManager.VERTICAL,false);
* 這里的6(自己設置的最好設置成偶數)就相當於分母,6默認顯示一整行(1列),下面的3 和2 就相當於分子,返回3就是(1/2)所以此類型對應的是2列,返回2就是(1/3)所以此類型對應的是3列
* */
switch (type) {
case TYPE_SLIDER:
case TYPE_TYPE2_HEAD:
case TYPE_TYPE3_HEAD:
case TYPE_TYPE4:
//這里的輪播圖類型和head 返回默認的spansize(即是6)
return gridManager.getSpanCount();
case TYPE_TYPE2:
return 3;
case TYPE_TYPE3:
return 2;
default:
//默認顯示2列
return 3;
}
}
});
}
}

/**
* 輪播圖點擊事件
* */
@Override
public void onSliderClick(BaseSliderView slider) {
Toast.makeText(mCtx,slider.getBundle().get("extra") + "", Toast.LENGTH_SHORT).show();
}

/*
* 輪播圖
* */
class SliderViewHolder extends RecyclerView.ViewHolder{

public SliderLayout slider;
public SliderViewHolder(View itemView) {
super(itemView);
slider = (SliderLayout) itemView.findViewById(R.id.slider);
}
}
/**
* head
* */
class HeadViewHolder extends RecyclerView.ViewHolder{

public ImageView image;
public HeadViewHolder(View itemView) {
super(itemView);
}
}
/**
* 條目顯示占多少列(這里由 setSpanSizeLookup動態控制)
* */
class TypeViewHolder extends RecyclerView.ViewHolder{

public ImageView image;
public TypeViewHolder(View itemView) {
super(itemView);
image= (ImageView) itemView.findViewById(R.id.item_img_type1);
}
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
到這里結束了!主要介紹了主要的思路!
本人描述能力有限,歡迎吐槽!

最后奉上demo:http://download.csdn.net/download/qq_34501274/9834284
---------------------
作者:KeepClam
來源:CSDN
原文:https://blog.csdn.net/qq_34501274/article/details/71194958
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM