用RecycleView来实现布局形式,默认只能指定一种布局格式,但是实际中我们的布局经常会用到多种类型的布局方式。如何实现呢?
今天来说下常用的2钟方式。
第一种:
通过自定义addHeadView方法来添加头布局
RecycleViewWithHead.Java
[java] view plain copy
print
?
1. import
2. import
3. import
4. import
5. import
6. import
7.
8. public class RecycleViewWithHead extends
9.
10. private
11. // 当前的条目是recyclerView的头布局
12. public static final int HEADER_RECYCLER_VIEW_ITEM = 0;
13. // 当前的条目是普通recyclerView的条目
14. public static final int NORMAL_RECYCLER_VIEW_ITEM = 1;
15.
16. @Override
17. protected void
18. // TODO Auto-generated method stub
19. super.onCreate(savedInstanceState);
20. setContentView(R.layout.activity_recycle);
21. rcv = (RecyclerView) findViewById(R.id.rcv);
22. // 设置布局管理
23. new GridLayoutManager(this, 2);
24. // 设置布局管理一条数据占用几行,如果是头布局则头布局自己占用一行
25. new
26. @Override
27. public int getSpanSize(int
28. if (postion == 0) {
29. return 2;
30. else
31. return 1;
32. }
33. }
34. });
35. rcv.setLayoutManager(manager);
36. new
37. this, 20);
38. this, R.layout.head, null);
39. adapter.addHeadView(view);
40. rcv.setAdapter(adapter);
41. }
42. }
import android.app.Activity;
import android.os.Bundle;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.GridLayoutManager.SpanSizeLookup;
import android.support.v7.widget.RecyclerView;
import android.view.View;
public class RecycleViewWithHead extends Activity {
private RecyclerView rcv;
// 当前的条目是recyclerView的头布局
public static final int HEADER_RECYCLER_VIEW_ITEM = 0;
// 当前的条目是普通recyclerView的条目
public static final int NORMAL_RECYCLER_VIEW_ITEM = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recycle);
rcv = (RecyclerView) findViewById(R.id.rcv);
// 设置布局管理
GridLayoutManager manager = new GridLayoutManager(this, 2);
// 设置布局管理一条数据占用几行,如果是头布局则头布局自己占用一行
manager.setSpanSizeLookup(new SpanSizeLookup() {
@Override
public int getSpanSize(int postion) {
if (postion == 0) {
return 2;
} else {
return 1;
}
}
});
rcv.setLayoutManager(manager);
MyRecycleAdapter adapter = new MyRecycleAdapter(
RecycleViewWithHead.this, 20);
View view = View.inflate(this, R.layout.head, null);
adapter.addHeadView(view);
rcv.setAdapter(adapter);
}
}
布局文件activity_recycle.xml
[html] view plain copy
print
?
1. <RelativeLayout xmlns:android=“http://schemas.android.com/apk/res/android”
2. xmlns:tools=“http://schemas.android.com/tools”
3. android:layout_width=“match_parent”
4. android:layout_height=“match_parent”>
5.
6.
7. <android.support.v7.widget.RecyclerView
8. android:id=“@+id/rcv”
9. android:layout_width=“match_parent”
10. android:layout_height=“wrap_content” />
11.
12.
13. </RelativeLayout>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/rcv"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</RelativeLayout>
头布局文件head.xml
[html]
view plain
copy
print
?
1. <?xml version=“1.0” encoding=“utf-8”?>
2. <RelativeLayout xmlns:android=“http://schemas.android.com/apk/res/android”
3. android:layout_width=“match_parent”
4. android:layout_height=“match_parent” >
5.
6. <ImageView
7. android:id=“@+id/iv_head”
8. android:layout_width=“80dp”
9. android:layout_height=“80dp”
10. android:layout_margin=“10dp”
11. android:src=“@drawable/head” />
12.
13. <TextView
14. android:id=“@+id/tv_head”
15. android:layout_width=“wrap_content”
16. android:layout_height=“wrap_content”
17. android:layout_alignTop=“@+id/iv_head”
18. android:layout_toRightOf=“@+id/iv_head”
19. android:text=“这是一张熊猫的图片” />
20.
21. <ImageView
22. android:id=“@+id/iv_head_bottom”
23. android:layout_width=“wrap_content”
24. android:layout_height=“wrap_content”
25. android:layout_alignBottom=“@+id/iv_head”
26. android:layout_toRightOf=“@+id/iv_head”
27. android:src=“@drawable/type” />
28.
29. </RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ImageView
android:id="@+id/iv_head"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_margin="10dp"
android:src="@drawable/head" />
<TextView
android:id="@+id/tv_head"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@+id/iv_head"
android:layout_toRightOf="@+id/iv_head"
android:text="这是一张熊猫的图片" />
<ImageView
android:id="@+id/iv_head_bottom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/iv_head"
android:layout_toRightOf="@+id/iv_head"
android:src="@drawable/type" />
</RelativeLayout>
适配器MyRecycleAdapter.java
[java] view plain copy
print
?
1. import
2. import
3. import
4. import
5. import
6. import
7. import
8. import
9.
10. public class MyRecycleAdapter extends
11. RecyclerView.Adapter<MyRecycleAdapterHolder> {
12.
13. private
14. private
15. private int
16.
17. int
18. this.count = count;
19. this.mContext = mContext;
20. }
21.
22. /**
23. * 设置数据源总的条目
24. */
25. @Override
26. public int
27. //返回条目数加头布局个数
28. return count + 1;
29. }
30.
31. @Override
32. public void
33. final int
34. int
35. // 头部
36. if
37. return;
38. else if (itemViewType == RecycleViewWithHead.NORMAL_RECYCLER_VIEW_ITEM) {//普通条目
39. new
40. @Override
41. public void
42. 1) + “”, 0).show();
43. }
44. });
45. }
46.
47. }
48.
49. @Override
50. public
51. int
52. null;
53. if
54. root = headView;
55. else
56. root = LayoutInflater.from(mContext).inflate(R.layout.item, parent,
57. false);
58. }
59. return new
60. }
61.
62. /**
63. * 添加自定义头部
64. */
65. public void
66. this.headView = view;
67. }
68.
69. @Override
70. public int getItemViewType(int
71.
72. if (position == 0) {
73. return
74. else
75. return
76. }
77. }
78. }
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.ViewHolder;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Toast;
public class MyRecycleAdapter extends
RecyclerView.Adapter<MyRecycleAdapterHolder> {
private View headView;
private Context mContext;
private int count;
MyRecycleAdapter(Context mContext, int count) {
this.count = count;
this.mContext = mContext;
}
/**
* 设置数据源总的条目
*/
@Override
public int getItemCount() {
//返回条目数加头布局个数
return count + 1;
}
@Override
public void onBindViewHolder(MyRecycleAdapterHolder holder,
final int position) {
int itemViewType = getItemViewType(position);
// 头部
if (itemViewType == RecycleViewWithHead.HEADER_RECYCLER_VIEW_ITEM) {
return;
} else if (itemViewType == RecycleViewWithHead.NORMAL_RECYCLER_VIEW_ITEM) {//普通条目
holder.iv_item_icon.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(mContext, (position - 1) + "", 0).show();
}
});
}
}
@Override
public MyRecycleAdapterHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
View root = null;
if (viewType == RecycleViewWithHead.HEADER_RECYCLER_VIEW_ITEM) {
root = headView;
} else {
root = LayoutInflater.from(mContext).inflate(R.layout.item, parent,
false);
}
return new MyRecycleAdapterHolder(root, viewType);
}
/**
* 添加自定义头部
*/
public void addHeadView(View view) {
this.headView = view;
}
@Override
public int getItemViewType(int position) {
if (position == 0) {
return RecycleViewWithHead.HEADER_RECYCLER_VIEW_ITEM;
} else {
return RecycleViewWithHead.NORMAL_RECYCLER_VIEW_ITEM;
}
}
}
普通条目的布局文件item.xml
[html] view plain copy
print
?
1. <?xml version=“1.0” encoding=“utf-8”?>
2. <LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”
3. android:id=“@+id/ll_list”
4. android:layout_width=“wrap_content”
5. android:layout_height=“wrap_content”
6. android:layout_marginLeft=“2dp”
7. android:layout_marginRight=“2dp”
8. android:layout_marginTop=“5dp”
9. android:orientation=“vertical” >
10.
11. <ImageView
12. android:id=“@+id/iv_item_icon”
13. android:layout_width=“wrap_content”
14. android:layout_height=“wrap_content”
15. android:src=“@drawable/item” />
16.
17. <TextView
18. android:id=“@+id/tv_item”
19. android:layout_width=“wrap_content”
20. android:layout_height=“wrap_content”
21. android:layout_gravity=“center_horizontal”
22. android:layout_marginTop=“5dp”
23. android:text=“这是一只熊猫” />
24.
25. </LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ll_list"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="2dp"
android:layout_marginRight="2dp"
android:layout_marginTop="5dp"
android:orientation="vertical" >
<ImageView
android:id="@+id/iv_item_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/item" />
<TextView
android:id="@+id/tv_item"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="5dp"
android:text="这是一只熊猫" />
</LinearLayout>
普通条目的ViewHolder
[java] view plain copy
print
?
1. import
2. import
3. import
4. import
5.
6. public class MyRecycleAdapterHolder extends
7.
8. public
9. public
10. public
11. super(itemView);
12. }
13. public MyRecycleAdapterHolder(View itemView,int
14. super(itemView);
15. initView(itemView,viewType);
16. }
17. private void initView(View itemView, int
18. iv_item_icon = (ImageView) itemView.findViewById(R.id.iv_item_icon);
19. tv_item = (TextView) itemView.findViewById(R.id.tv_item);
20. }
21.
22. }
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
public class MyRecycleAdapterHolder extends RecyclerView.ViewHolder{
public ImageView iv_item_icon;
public TextView tv_item;
public MyRecycleAdapterHolder(View itemView) {
super(itemView);
}
public MyRecycleAdapterHolder(View itemView,int viewType) {
super(itemView);
initView(itemView,viewType);
}
private void initView(View itemView, int viewType) {
iv_item_icon = (ImageView) itemView.findViewById(R.id.iv_item_icon);
tv_item = (TextView) itemView.findViewById(R.id.tv_item);
}
}
效果图:

还有一种情况类似于淘宝的商品展示我们可以切换每行显示的数量,其实也很简单
先看下要实现的效果:

我先说下大致的实现思路:
1.给adapter设置一个当前显示多行还是单行的标记。
2.每次切换视图时重置标记,并重置RecycleView的LayoutManager。
3.调用adapter.notifyItemRangeChanged(2, adapter.getItemCount());(第一个参数是动画开始的位置索引)
好了再来看下RecycleViewWithHead.java
[java] view plain copy
print
?
1. import
2. import
3. import
4. import
5. import
6. import
7. import
8. import
9. import
10.
11. public class RecycleViewWithHead extends Activity implements
12.
13. private
14. // 当前的条目是recyclerView的头布局
15. public static final int HEADER_RECYCLER_VIEW_ITEM = 0;
16. // 当前的条目是普通recyclerView的条目
17. public static final int NORMAL_RECYCLER_VIEW_ITEM = 1;
18. // 一行显示一个
19. public static final int RECYCLER_VIEW_ITEM_SINGLE = 3;
20. // 一行显示两个
21. public static final int RECYCLER_VIEW_ITEM_DOUBLE = 4;
22. private ImageView iv_switch;// 视图转换
23. private
24. private
25.
26. @Override
27. protected void
28. // TODO Auto-generated method stub
29. super.onCreate(savedInstanceState);
30. setContentView(R.layout.activity_recycle);
31. rcv = (RecyclerView) findViewById(R.id.rcv);
32. iv_switch = (ImageView) findViewById(R.id.iv_switch);
33. this);
34. new GridLayoutManager(this, 2);
35. // 设置布局管理一条数据占用几行,如果是头布局则头布局自己占用一行
36. new
37. @Override
38. public int getSpanSize(int
39. if (postion == 0) {
40. return 2;
41. else
42. return 1;
43. }
44. }
45. });
46. rcv.setLayoutManager(manager);
47. new MyRecycleAdapter(RecycleViewWithHead.this, 20);
48. this, R.layout.head, null);
49. // 设置当前ViewType
50. adapter.setSpanSize(RecycleViewWithHead.RECYCLER_VIEW_ITEM_DOUBLE);
51. adapter.addHeadView(view);
52. rcv.setAdapter(adapter);
53. }
54.
55. @Override
56. public void
57. switch
58. case
59. changeRecycleViewList();
60. break;
61.
62. default:
63. break;
64. }
65.
66. }
67.
68. /**
69. * 改变RecycleView的显示列数
70. */
71. private void
72. if (adapter != null) {
73. int
74. // 当前一行显示一列
75. if
76. new
77. @Override
78. public int getSpanSize(int
79. if
80. return 2;
81. else
82. return 1;
83.
84. }
85. }
86. });
87. adapter.setSpanSize(RecycleViewWithHead.RECYCLER_VIEW_ITEM_DOUBLE);
88. }
89. // 当前一行显示两列
90. else if
91. new
92. @Override
93. public int getSpanSize(int
94. if
95. return 2;
96. else
97. return 2;
98. }
99. }
100. });
101. adapter.setSpanSize(RecycleViewWithHead.RECYCLER_VIEW_ITEM_SINGLE);
102. }
103. // 第一个参数是动画开始的位置索引
104. 2, adapter.getItemCount());
105. }
106. }
107. }
import com.example.myrecycleviewdemo.adapter.MyRecycleAdapter;
import android.app.Activity;
import android.os.Bundle;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.GridLayoutManager.SpanSizeLookup;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
public class RecycleViewWithHead extends Activity implements OnClickListener {
private RecyclerView rcv;
// 当前的条目是recyclerView的头布局
public static final int HEADER_RECYCLER_VIEW_ITEM = 0;
// 当前的条目是普通recyclerView的条目
public static final int NORMAL_RECYCLER_VIEW_ITEM = 1;
// 一行显示一个
public static final int RECYCLER_VIEW_ITEM_SINGLE = 3;
// 一行显示两个
public static final int RECYCLER_VIEW_ITEM_DOUBLE = 4;
private ImageView iv_switch;// 视图转换
private MyRecycleAdapter adapter;
private GridLayoutManager manager;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recycle);
rcv = (RecyclerView) findViewById(R.id.rcv);
iv_switch = (ImageView) findViewById(R.id.iv_switch);
iv_switch.setOnClickListener(this);
manager = new GridLayoutManager(this, 2);
// 设置布局管理一条数据占用几行,如果是头布局则头布局自己占用一行
manager.setSpanSizeLookup(new SpanSizeLookup() {
@Override
public int getSpanSize(int postion) {
if (postion == 0) {
return 2;
} else {
return 1;
}
}
});
rcv.setLayoutManager(manager);
adapter = new MyRecycleAdapter(RecycleViewWithHead.this, 20);
View view = View.inflate(this, R.layout.head, null);
// 设置当前ViewType
adapter.setSpanSize(RecycleViewWithHead.RECYCLER_VIEW_ITEM_DOUBLE);
adapter.addHeadView(view);
rcv.setAdapter(adapter);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.iv_switch:
changeRecycleViewList();
break;
default:
break;
}
}
/**
* 改变RecycleView的显示列数
*/
private void changeRecycleViewList() {
if (adapter != null) {
int spanSize = adapter.getSpanSize();
// 当前一行显示一列
if (spanSize == RecycleViewWithHead.RECYCLER_VIEW_ITEM_SINGLE) {
manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
if (adapter.getItemViewType(position) == RecycleViewWithHead.HEADER_RECYCLER_VIEW_ITEM) {
return 2;
} else {
return 1;
}
}
});
adapter.setSpanSize(RecycleViewWithHead.RECYCLER_VIEW_ITEM_DOUBLE);
}
// 当前一行显示两列
else if (spanSize == RecycleViewWithHead.RECYCLER_VIEW_ITEM_DOUBLE) {
manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
if (adapter.getItemViewType(position) == RecycleViewWithHead.HEADER_RECYCLER_VIEW_ITEM) {
return 2;
} else {
return 2;
}
}
});
adapter.setSpanSize(RecycleViewWithHead.RECYCLER_VIEW_ITEM_SINGLE);
}
// 第一个参数是动画开始的位置索引
adapter.notifyItemRangeChanged(2, adapter.getItemCount());
}
}
}
布局文件activity_recycle.xml
[html] view plain copy
print
?
1. <RelativeLayout xmlns:android=“http://schemas.android.com/apk/res/android”
2. xmlns:tools=“http://schemas.android.com/tools”
3. android:layout_width=“match_parent”
4. android:layout_height=“match_parent”>
5.
6. <android.support.v7.widget.RecyclerView
7. android:id=“@+id/rcv”
8. android:layout_width=“match_parent”
9. android:layout_height=“wrap_content” />
10.
11. <ImageView
12. android:id=“@+id/iv_switch”
13. android:layout_width=“wrap_content”
14. android:layout_height=“wrap_content”
15. android:layout_alignParentTop=“true”
16. android:layout_alignParentRight=“true”
17. android:layout_margin=“20dp”
18. android:src=“@drawable/more”
19. />
20.
21. </RelativeLayout>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/rcv"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<ImageView
android:id="@+id/iv_switch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_margin="20dp"
android:src="@drawable/more"
/>
</RelativeLayout>适配器MyRecycleAdapter.java
[java] view plain copy
print
?
1. import
2. import
3. import
4. import
5. import
6. import
7. import
8. import
9. import
10. import
11. import
12.
13. public class MyRecycleAdapter extends
14. RecyclerView.Adapter<MyRecycleAdapterHolder> {
15.
16. public
17. public
18. public int
19. private int spanSize;// 当前每行显示几列
20.
21. public MyRecycleAdapter(Context mContext, int
22. this.count = count;
23. this.mContext = mContext;
24. }
25.
26. /**
27. * 设置数据源总的条目
28. */
29. @Override
30. public int
31. // 返回条目数加头布局个数
32. return count + 1;
33. }
34.
35. @Override
36. public void
37. final int
38. int
39. // 头部
40. if
41. return;
42. else {// 普通条目
43. if (itemViewType == RecycleViewWithHead.RECYCLER_VIEW_ITEM_DOUBLE) {// 一行两列视图
44. new
45. @Override
46. public void
47. ”2列,” + (position - 1) + “”, 0)
48. .show();
49. }
50. });
51. else if (itemViewType == RecycleViewWithHead.RECYCLER_VIEW_ITEM_SINGLE) {// 一行一列视图
52. new
53. @Override
54. public void
55. ”单列,” + (position - 1) + “”, 0).show();
56. }
57. });
58. }
59. }
60. }
61.
62. @Override
63. public
64. int
65. null;
66. // 头部
67. if
68. root = headView;
69. else {// 普通条目
70. /** 一行显示一条 */
71. if
72. false);
73. }
74. /** 一行显示两条 */
75. else
76. false);
77. }
78. }
79. return new
80. }
81.
82. /**
83. * 添加自定义头部
84. */
85. public void
86. this.headView = view;
87. }
88.
89. @Override
90. public int getItemViewType(int
91.
92. if (position == 0) {
93. return
94. else
95. /** 一行显示一条 */
96. if
97. return
98. /** 一行显示两条 */
99. else
100. return
101. }
102. }
103. }
104.
105. public int
106. return
107. }
108.
109. public void setSpanSize(int
110. this.spanSize = spanSize;
111. }
112. }
import com.example.myrecycleviewdemo.R;
import com.example.myrecycleviewdemo.RecycleViewWithHead;
import com.example.myrecycleviewdemo.R.layout;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.ViewHolder;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Toast;
public class MyRecycleAdapter extends
RecyclerView.Adapter<MyRecycleAdapterHolder> {
public View headView;
public Context mContext;
public int count;
private int spanSize;// 当前每行显示几列
public MyRecycleAdapter(Context mContext, int count) {
this.count = count;
this.mContext = mContext;
}
/**
* 设置数据源总的条目
*/
@Override
public int getItemCount() {
// 返回条目数加头布局个数
return count + 1;
}
@Override
public void onBindViewHolder(MyRecycleAdapterHolder holder,
final int position) {
int itemViewType = getItemViewType(position);
// 头部
if (itemViewType == RecycleViewWithHead.HEADER_RECYCLER_VIEW_ITEM) {
return;
} else {// 普通条目
if (itemViewType == RecycleViewWithHead.RECYCLER_VIEW_ITEM_DOUBLE) {// 一行两列视图
holder.iv_item_icon.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(mContext, "2列," + (position - 1) + "", 0)
.show();
}
});
} else if (itemViewType == RecycleViewWithHead.RECYCLER_VIEW_ITEM_SINGLE) {// 一行一列视图
holder.iv_item_icon_single.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(mContext,"单列," + (position - 1) + "", 0).show();
}
});
}
}
}
@Override
public MyRecycleAdapterHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
View root = null;
// 头部
if (viewType == RecycleViewWithHead.HEADER_RECYCLER_VIEW_ITEM) {
root = headView;
} else {// 普通条目
/** 一行显示一条 */
if (viewType == RecycleViewWithHead.RECYCLER_VIEW_ITEM_SINGLE) {
root = LayoutInflater.from(mContext).inflate(R.layout.item_single, parent, false);
}
/** 一行显示两条 */
else {
root = LayoutInflater.from(mContext).inflate(R.layout.item_double, parent, false);
}
}
return new MyRecycleAdapterHolder(root, viewType);
}
/**
* 添加自定义头部
*/
public void addHeadView(View view) {
this.headView = view;
}
@Override
public int getItemViewType(int position) {
if (position == 0) {
return RecycleViewWithHead.HEADER_RECYCLER_VIEW_ITEM;
} else {
/** 一行显示一条 */
if (spanSize == RecycleViewWithHead.RECYCLER_VIEW_ITEM_SINGLE) {
return RecycleViewWithHead.RECYCLER_VIEW_ITEM_SINGLE;
/** 一行显示两条 */
} else {
return RecycleViewWithHead.RECYCLER_VIEW_ITEM_DOUBLE;
}
}
}
public int getSpanSize() {
return spanSize;
}
public void setSpanSize(int spanSize) {
this.spanSize = spanSize;
}
}
普通条目的ViewHolder
[java] view plain copy
print
?
1. import
2. import
3. import
4. import
5. import
6. import
7. import
8.
9. public class MyRecycleAdapterHolder extends
10. //一行两列视图
11. public
12. public
13.
14. //一行一列视图
15. public
16. public
17.
18. public
19. super(itemView);
20. }
21. public MyRecycleAdapterHolder(View itemView,int
22. super(itemView);
23. initView(itemView,viewType);
24. }
25. private void initView(View itemView, int
26. if(viewType == RecycleViewWithHead.RECYCLER_VIEW_ITEM_DOUBLE){
27. iv_item_icon = (ImageView) itemView.findViewById(R.id.iv_item_icon);
28. tv_item = (TextView) itemView.findViewById(R.id.tv_item);
29. else if(viewType == RecycleViewWithHead.RECYCLER_VIEW_ITEM_SINGLE){
30. iv_item_icon_single = (ImageView) itemView.findViewById(R.id.iv_item_icon_single);
31. tv_item_single = (TextView) itemView.findViewById(R.id.tv_item_single);
32. }
33. }
34. }
import com.example.myrecycleviewdemo.R;
import com.example.myrecycleviewdemo.R.id;
import com.example.myrecycleviewdemo.RecycleViewWithHead;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
public class MyRecycleAdapterHolder extends RecyclerView.ViewHolder{
//一行两列视图
public ImageView iv_item_icon;
public TextView tv_item;
//一行一列视图
public ImageView iv_item_icon_single;
public TextView tv_item_single;
public MyRecycleAdapterHolder(View itemView) {
super(itemView);
}
public MyRecycleAdapterHolder(View itemView,int viewType) {
super(itemView);
initView(itemView,viewType);
}
private void initView(View itemView, int viewType) {
if(viewType == RecycleViewWithHead.RECYCLER_VIEW_ITEM_DOUBLE){
iv_item_icon = (ImageView) itemView.findViewById(R.id.iv_item_icon);
tv_item = (TextView) itemView.findViewById(R.id.tv_item);
}else if(viewType == RecycleViewWithHead.RECYCLER_VIEW_ITEM_SINGLE){
iv_item_icon_single = (ImageView) itemView.findViewById(R.id.iv_item_icon_single);
tv_item_single = (TextView) itemView.findViewById(R.id.tv_item_single);
}
}
}
头布局文件head.xm没有任何变化
条目的布局拆分为2个item_double.xml和item_single.xml
item_double.xml和之前的item.xml一样。
item_single.xml
[html] view plain copy
print
?
1. <?xml version=“1.0” encoding=“utf-8”?>
2. <LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”
3. android:id=“@+id/ll_list”
4. android:layout_width=“wrap_content”
5. android:layout_height=“wrap_content”
6. android:layout_marginLeft=“2dp”
7. android:layout_marginRight=“2dp”
8. android:layout_marginTop=“5dp”
9. android:orientation=“horizontal” >
10.
11. <ImageView
12. android:id=“@+id/iv_item_icon_single”
13. android:layout_width=“wrap_content”
14. android:layout_height=“wrap_content”
15. android:src=“@drawable/item” />
16.
17. <TextView
18. android:id=“@+id/tv_item_single”
19. android:layout_width=“wrap_content”
20. android:layout_height=“wrap_content”
21. android:layout_gravity=“center_vertical”
22. android:layout_marginTop=“5dp”
23. android:text=“这是一只熊猫” />
24.
25. </LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ll_list"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="2dp"
android:layout_marginRight="2dp"
android:layout_marginTop="5dp"
android:orientation="horizontal" >
<ImageView
android:id="@+id/iv_item_icon_single"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/item" />
<TextView
android:id="@+id/tv_item_single"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginTop="5dp"
android:text="这是一只熊猫" />
</LinearLayout>
源码地址:http://download.csdn.NET/detail/linder_qzy/9491370
用RecycleView来实现布局形式,默认只能指定一种布局格式,但是实际中我们的布局经常会用到多种类型的布局方式。如何实现呢?
今天来说下常用的2钟方式。
第一种:
通过自定义addHeadView方法来添加头布局
RecycleViewWithHead.Java
[java] view plain copy
print
?
1. import
2. import
3. import
4. import
5. import
6. import
7.
8. public class RecycleViewWithHead extends
9.
10. private
11. // 当前的条目是recyclerView的头布局
12. public static final int HEADER_RECYCLER_VIEW_ITEM = 0;
13. // 当前的条目是普通recyclerView的条目
14. public static final int NORMAL_RECYCLER_VIEW_ITEM = 1;
15.
16. @Override
17. protected void
18. // TODO Auto-generated method stub
19. super.onCreate(savedInstanceState);
20. setContentView(R.layout.activity_recycle);
21. rcv = (RecyclerView) findViewById(R.id.rcv);
22. // 设置布局管理
23. new GridLayoutManager(this, 2);
24. // 设置布局管理一条数据占用几行,如果是头布局则头布局自己占用一行
25. new
26. @Override
27. public int getSpanSize(int
28. if (postion == 0) {
29. return 2;
30. else
31. return 1;
32. }
33. }
34. });
35. rcv.setLayoutManager(manager);
36. new
37. this, 20);
38. this, R.layout.head, null);
39. adapter.addHeadView(view);
40. rcv.setAdapter(adapter);
41. }
42. }
import android.app.Activity;
import android.os.Bundle;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.GridLayoutManager.SpanSizeLookup;
import android.support.v7.widget.RecyclerView;
import android.view.View;
public class RecycleViewWithHead extends Activity {
private RecyclerView rcv;
// 当前的条目是recyclerView的头布局
public static final int HEADER_RECYCLER_VIEW_ITEM = 0;
// 当前的条目是普通recyclerView的条目
public static final int NORMAL_RECYCLER_VIEW_ITEM = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recycle);
rcv = (RecyclerView) findViewById(R.id.rcv);
// 设置布局管理
GridLayoutManager manager = new GridLayoutManager(this, 2);
// 设置布局管理一条数据占用几行,如果是头布局则头布局自己占用一行
manager.setSpanSizeLookup(new SpanSizeLookup() {
@Override
public int getSpanSize(int postion) {
if (postion == 0) {
return 2;
} else {
return 1;
}
}
});
rcv.setLayoutManager(manager);
MyRecycleAdapter adapter = new MyRecycleAdapter(
RecycleViewWithHead.this, 20);
View view = View.inflate(this, R.layout.head, null);
adapter.addHeadView(view);
rcv.setAdapter(adapter);
}
}
布局文件activity_recycle.xml
[html] view plain copy
print
?
1. <RelativeLayout xmlns:android=“http://schemas.android.com/apk/res/android”
2. xmlns:tools=“http://schemas.android.com/tools”
3. android:layout_width=“match_parent”
4. android:layout_height=“match_parent”>
5.
6.
7. <android.support.v7.widget.RecyclerView
8. android:id=“@+id/rcv”
9. android:layout_width=“match_parent”
10. android:layout_height=“wrap_content” />
11.
12.
13. </RelativeLayout>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/rcv"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</RelativeLayout>
头布局文件head.xml
[html] view plain copy
print
?
1. <?xml version=“1.0” encoding=“utf-8”?>
2. <RelativeLayout xmlns:android=“http://schemas.android.com/apk/res/android”
3. android:layout_width=“match_parent”
4. android:layout_height=“match_parent” >
5.
6. <ImageView
7. android:id=“@+id/iv_head”
8. android:layout_width=“80dp”
9. android:layout_height=“80dp”
10. android:layout_margin=“10dp”
11. android:src=“@drawable/head” />
12.
13. <TextView
14. android:id=“@+id/tv_head”
15. android:layout_width=“wrap_content”
16. android:layout_height=“wrap_content”
17. android:layout_alignTop=“@+id/iv_head”
18. android:layout_toRightOf=“@+id/iv_head”
19. android:text=“这是一张熊猫的图片” />
20.
21. <ImageView
22. android:id=“@+id/iv_head_bottom”
23. android:layout_width=“wrap_content”
24. android:layout_height=“wrap_content”
25. android:layout_alignBottom=“@+id/iv_head”
26. android:layout_toRightOf=“@+id/iv_head”
27. android:src=“@drawable/type” />
28.
29. </RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ImageView
android:id="@+id/iv_head"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_margin="10dp"
android:src="@drawable/head" />
<TextView
android:id="@+id/tv_head"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@+id/iv_head"
android:layout_toRightOf="@+id/iv_head"
android:text="这是一张熊猫的图片" />
<ImageView
android:id="@+id/iv_head_bottom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/iv_head"
android:layout_toRightOf="@+id/iv_head"
android:src="@drawable/type" />
</RelativeLayout>
适配器MyRecycleAdapter.java
[java] view plain copy
print
?
1. import
2. import
3. import
4. import
5. import
6. import
7. import
8. import
9.
10. public class MyRecycleAdapter extends
11. RecyclerView.Adapter<MyRecycleAdapterHolder> {
12.
13. private
14. private
15. private int
16.
17. int
18. this.count = count;
19. this.mContext = mContext;
20. }
21.
22. /**
23. * 设置数据源总的条目
24. */
25. @Override
26. public int
27. //返回条目数加头布局个数
28. return count + 1;
29. }
30.
31. @Override
32. public void
33. final int
34. int
35. // 头部
36. if
37. return;
38. else if (itemViewType == RecycleViewWithHead.NORMAL_RECYCLER_VIEW_ITEM) {//普通条目
39. new
40. @Override
41. public void
42. 1) + “”, 0).show();
43. }
44. });
45. }
46.
47. }
48.
49. @Override
50. public
51. int
52. null;
53. if
54. root = headView;
55. else
56. root = LayoutInflater.from(mContext).inflate(R.layout.item, parent,
57. false);
58. }
59. return new
60. }
61.
62. /**
63. * 添加自定义头部
64. */
65. public void
66. this.headView = view;
67. }
68.
69. @Override
70. public int getItemViewType(int
71.
72. if (position == 0) {
73. return
74. else
75. return
76. }
77. }
78. }
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.ViewHolder;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Toast;
public class MyRecycleAdapter extends
RecyclerView.Adapter<MyRecycleAdapterHolder> {
private View headView;
private Context mContext;
private int count;
MyRecycleAdapter(Context mContext, int count) {
this.count = count;
this.mContext = mContext;
}
/**
* 设置数据源总的条目
*/
@Override
public int getItemCount() {
//返回条目数加头布局个数
return count + 1;
}
@Override
public void onBindViewHolder(MyRecycleAdapterHolder holder,
final int position) {
int itemViewType = getItemViewType(position);
// 头部
if (itemViewType == RecycleViewWithHead.HEADER_RECYCLER_VIEW_ITEM) {
return;
} else if (itemViewType == RecycleViewWithHead.NORMAL_RECYCLER_VIEW_ITEM) {//普通条目
holder.iv_item_icon.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(mContext, (position - 1) + "", 0).show();
}
});
}
}
@Override
public MyRecycleAdapterHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
View root = null;
if (viewType == RecycleViewWithHead.HEADER_RECYCLER_VIEW_ITEM) {
root = headView;
} else {
root = LayoutInflater.from(mContext).inflate(R.layout.item, parent,
false);
}
return new MyRecycleAdapterHolder(root, viewType);
}
/**
* 添加自定义头部
*/
public void addHeadView(View view) {
this.headView = view;
}
@Override
public int getItemViewType(int position) {
if (position == 0) {
return RecycleViewWithHead.HEADER_RECYCLER_VIEW_ITEM;
} else {
return RecycleViewWithHead.NORMAL_RECYCLER_VIEW_ITEM;
}
}
}
普通条目的布局文件item.xml
[html] view plain copy
print
?
1. <?xml version=“1.0” encoding=“utf-8”?>
2. <LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”
3. android:id=“@+id/ll_list”
4. android:layout_width=“wrap_content”
5. android:layout_height=“wrap_content”
6. android:layout_marginLeft=“2dp”
7. android:layout_marginRight=“2dp”
8. android:layout_marginTop=“5dp”
9. android:orientation=“vertical” >
10.
11. <ImageView
12. android:id=“@+id/iv_item_icon”
13. android:layout_width=“wrap_content”
14. android:layout_height=“wrap_content”
15. android:src=“@drawable/item” />
16.
17. <TextView
18. android:id=“@+id/tv_item”
19. android:layout_width=“wrap_content”
20. android:layout_height=“wrap_content”
21. android:layout_gravity=“center_horizontal”
22. android:layout_marginTop=“5dp”
23. android:text=“这是一只熊猫” />
24.
25. </LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ll_list"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="2dp"
android:layout_marginRight="2dp"
android:layout_marginTop="5dp"
android:orientation="vertical" >
<ImageView
android:id="@+id/iv_item_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/item" />
<TextView
android:id="@+id/tv_item"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="5dp"
android:text="这是一只熊猫" />
</LinearLayout>
普通条目的ViewHolder
[java] view plain copy
print
?
1. import
2. import
3. import
4. import
5.
6. public class MyRecycleAdapterHolder extends
7.
8. public
9. public
10. public
11. super(itemView);
12. }
13. public MyRecycleAdapterHolder(View itemView,int
14. super(itemView);
15. initView(itemView,viewType);
16. }
17. private void initView(View itemView, int
18. iv_item_icon = (ImageView) itemView.findViewById(R.id.iv_item_icon);
19. tv_item = (TextView) itemView.findViewById(R.id.tv_item);
20. }
21.
22. }
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
public class MyRecycleAdapterHolder extends RecyclerView.ViewHolder{
public ImageView iv_item_icon;
public TextView tv_item;
public MyRecycleAdapterHolder(View itemView) {
super(itemView);
}
public MyRecycleAdapterHolder(View itemView,int viewType) {
super(itemView);
initView(itemView,viewType);
}
private void initView(View itemView, int viewType) {
iv_item_icon = (ImageView) itemView.findViewById(R.id.iv_item_icon);
tv_item = (TextView) itemView.findViewById(R.id.tv_item);
}
}
效果图:

还有一种情况类似于淘宝的商品展示我们可以切换每行显示的数量,其实也很简单
先看下要实现的效果:

我先说下大致的实现思路:
1.给adapter设置一个当前显示多行还是单行的标记。
2.每次切换视图时重置标记,并重置RecycleView的LayoutManager。
3.调用adapter.notifyItemRangeChanged(2, adapter.getItemCount());(第一个参数是动画开始的位置索引)
好了再来看下RecycleViewWithHead.java
[java] view plain copy
print
?
1. import
2. import
3. import
4. import
5. import
6. import
7. import
8. import
9. import
10.
11. public class RecycleViewWithHead extends Activity implements
12.
13. private
14. // 当前的条目是recyclerView的头布局
15. public static final int HEADER_RECYCLER_VIEW_ITEM = 0;
16. // 当前的条目是普通recyclerView的条目
17. public static final int NORMAL_RECYCLER_VIEW_ITEM = 1;
18. // 一行显示一个
19. public static final int RECYCLER_VIEW_ITEM_SINGLE = 3;
20. // 一行显示两个
21. public static final int RECYCLER_VIEW_ITEM_DOUBLE = 4;
22. private ImageView iv_switch;// 视图转换
23. private
24. private
25.
26. @Override
27. protected void
28. // TODO Auto-generated method stub
29. super.onCreate(savedInstanceState);
30. setContentView(R.layout.activity_recycle);
31. rcv = (RecyclerView) findViewById(R.id.rcv);
32. iv_switch = (ImageView) findViewById(R.id.iv_switch);
33. this);
34. new GridLayoutManager(this, 2);
35. // 设置布局管理一条数据占用几行,如果是头布局则头布局自己占用一行
36. new
37. @Override
38. public int getSpanSize(int
39. if (postion == 0) {
40. return 2;
41. else
42. return 1;
43. }
44. }
45. });
46. rcv.setLayoutManager(manager);
47. new MyRecycleAdapter(RecycleViewWithHead.this, 20);
48. this, R.layout.head, null);
49. // 设置当前ViewType
50. adapter.setSpanSize(RecycleViewWithHead.RECYCLER_VIEW_ITEM_DOUBLE);
51. adapter.addHeadView(view);
52. rcv.setAdapter(adapter);
53. }
54.
55. @Override
56. public void
57. switch
58. case
59. changeRecycleViewList();
60. break;
61.
62. default:
63. break;
64. }
65.
66. }
67.
68. /**
69. * 改变RecycleView的显示列数
70. */
71. private void
72. if (adapter != null) {
73. int
74. // 当前一行显示一列
75. if
76. new
77. @Override
78. public int getSpanSize(int
79. if
80. return 2;
81. else
82. return 1;
83.
84. }
85. }
86. });
87. adapter.setSpanSize(RecycleViewWithHead.RECYCLER_VIEW_ITEM_DOUBLE);
88. }
89. // 当前一行显示两列
90. else if
91. new
92. @Override
93. public int getSpanSize(int
94. if
95. return 2;
96. else
97. return 2;
98. }
99. }
100. });
101. adapter.setSpanSize(RecycleViewWithHead.RECYCLER_VIEW_ITEM_SINGLE);
102. }
103. // 第一个参数是动画开始的位置索引
104. 2, adapter.getItemCount());
105. }
106. }
107. }
import com.example.myrecycleviewdemo.adapter.MyRecycleAdapter;
import android.app.Activity;
import android.os.Bundle;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.GridLayoutManager.SpanSizeLookup;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
public class RecycleViewWithHead extends Activity implements OnClickListener {
private RecyclerView rcv;
// 当前的条目是recyclerView的头布局
public static final int HEADER_RECYCLER_VIEW_ITEM = 0;
// 当前的条目是普通recyclerView的条目
public static final int NORMAL_RECYCLER_VIEW_ITEM = 1;
// 一行显示一个
public static final int RECYCLER_VIEW_ITEM_SINGLE = 3;
// 一行显示两个
public static final int RECYCLER_VIEW_ITEM_DOUBLE = 4;
private ImageView iv_switch;// 视图转换
private MyRecycleAdapter adapter;
private GridLayoutManager manager;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recycle);
rcv = (RecyclerView) findViewById(R.id.rcv);
iv_switch = (ImageView) findViewById(R.id.iv_switch);
iv_switch.setOnClickListener(this);
manager = new GridLayoutManager(this, 2);
// 设置布局管理一条数据占用几行,如果是头布局则头布局自己占用一行
manager.setSpanSizeLookup(new SpanSizeLookup() {
@Override
public int getSpanSize(int postion) {
if (postion == 0) {
return 2;
} else {
return 1;
}
}
});
rcv.setLayoutManager(manager);
adapter = new MyRecycleAdapter(RecycleViewWithHead.this, 20);
View view = View.inflate(this, R.layout.head, null);
// 设置当前ViewType
adapter.setSpanSize(RecycleViewWithHead.RECYCLER_VIEW_ITEM_DOUBLE);
adapter.addHeadView(view);
rcv.setAdapter(adapter);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.iv_switch:
changeRecycleViewList();
break;
default:
break;
}
}
/**
* 改变RecycleView的显示列数
*/
private void changeRecycleViewList() {
if (adapter != null) {
int spanSize = adapter.getSpanSize();
// 当前一行显示一列
if (spanSize == RecycleViewWithHead.RECYCLER_VIEW_ITEM_SINGLE) {
manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
if (adapter.getItemViewType(position) == RecycleViewWithHead.HEADER_RECYCLER_VIEW_ITEM) {
return 2;
} else {
return 1;
}
}
});
adapter.setSpanSize(RecycleViewWithHead.RECYCLER_VIEW_ITEM_DOUBLE);
}
// 当前一行显示两列
else if (spanSize == RecycleViewWithHead.RECYCLER_VIEW_ITEM_DOUBLE) {
manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
if (adapter.getItemViewType(position) == RecycleViewWithHead.HEADER_RECYCLER_VIEW_ITEM) {
return 2;
} else {
return 2;
}
}
});
adapter.setSpanSize(RecycleViewWithHead.RECYCLER_VIEW_ITEM_SINGLE);
}
// 第一个参数是动画开始的位置索引
adapter.notifyItemRangeChanged(2, adapter.getItemCount());
}
}
}
布局文件activity_recycle.xml
[html] view plain copy
print
?
1. <RelativeLayout xmlns:android=“http://schemas.android.com/apk/res/android”
2. xmlns:tools=“http://schemas.android.com/tools”
3. android:layout_width=“match_parent”
4. android:layout_height=“match_parent”>
5.
6. <android.support.v7.widget.RecyclerView
7. android:id=“@+id/rcv”
8. android:layout_width=“match_parent”
9. android:layout_height=“wrap_content” />
10.
11. <ImageView
12. android:id=“@+id/iv_switch”
13. android:layout_width=“wrap_content”
14. android:layout_height=“wrap_content”
15. android:layout_alignParentTop=“true”
16. android:layout_alignParentRight=“true”
17. android:layout_margin=“20dp”
18. android:src=“@drawable/more”
19. />
20.
21. </RelativeLayout>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/rcv"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<ImageView
android:id="@+id/iv_switch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_margin="20dp"
android:src="@drawable/more"
/>
</RelativeLayout>适配器MyRecycleAdapter.java
[java] view plain copy
print
?
1. import
2. import
3. import
4. import
5. import
6. import
7. import
8. import
9. import
10. import
11. import
12.
13. public class MyRecycleAdapter extends
14. RecyclerView.Adapter<MyRecycleAdapterHolder> {
15.
16. public
17. public
18. public int
19. private int spanSize;// 当前每行显示几列
20.
21. public MyRecycleAdapter(Context mContext, int
22. this.count = count;
23. this.mContext = mContext;
24. }
25.
26. /**
27. * 设置数据源总的条目
28. */
29. @Override
30. public int
31. // 返回条目数加头布局个数
32. return count + 1;
33. }
34.
35. @Override
36. public void
37. final int
38. int
39. // 头部
40. if
41. return;
42. else {// 普通条目
43. if (itemViewType == RecycleViewWithHead.RECYCLER_VIEW_ITEM_DOUBLE) {// 一行两列视图
44. new
45. @Override
46. public void
47. ”2列,” + (position - 1) + “”, 0)
48. .show();
49. }
50. });
51. else if (itemViewType == RecycleViewWithHead.RECYCLER_VIEW_ITEM_SINGLE) {// 一行一列视图
52. new
53. @Override
54. public void
55. ”单列,” + (position - 1) + “”, 0).show();
56. }
57. });
58. }
59. }
60. }
61.
62. @Override
63. public
64. int
65. null;
66. // 头部
67. if
68. root = headView;
69. else {// 普通条目
70. /** 一行显示一条 */
71. if
72. false);
73. }
74. /** 一行显示两条 */
75. else
76. false);
77. }
78. }
79. return new
80. }
81.
82. /**
83. * 添加自定义头部
84. */
85. public void
86. this.headView = view;
87. }
88.
89. @Override
90. public int getItemViewType(int
91.
92. if (position == 0) {
93. return
94. else
95. /** 一行显示一条 */
96. if
97. return
98. /** 一行显示两条 */
99. else
100. return
101. }
102. }
103. }
104.
105. public int
106. return
107. }
108.
109. public void setSpanSize(int
110. this.spanSize = spanSize;
111. }
112. }
import com.example.myrecycleviewdemo.R;
import com.example.myrecycleviewdemo.RecycleViewWithHead;
import com.example.myrecycleviewdemo.R.layout;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.ViewHolder;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Toast;
public class MyRecycleAdapter extends
RecyclerView.Adapter<MyRecycleAdapterHolder> {
public View headView;
public Context mContext;
public int count;
private int spanSize;// 当前每行显示几列
public MyRecycleAdapter(Context mContext, int count) {
this.count = count;
this.mContext = mContext;
}
/**
* 设置数据源总的条目
*/
@Override
public int getItemCount() {
// 返回条目数加头布局个数
return count + 1;
}
@Override
public void onBindViewHolder(MyRecycleAdapterHolder holder,
final int position) {
int itemViewType = getItemViewType(position);
// 头部
if (itemViewType == RecycleViewWithHead.HEADER_RECYCLER_VIEW_ITEM) {
return;
} else {// 普通条目
if (itemViewType == RecycleViewWithHead.RECYCLER_VIEW_ITEM_DOUBLE) {// 一行两列视图
holder.iv_item_icon.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(mContext, "2列," + (position - 1) + "", 0)
.show();
}
});
} else if (itemViewType == RecycleViewWithHead.RECYCLER_VIEW_ITEM_SINGLE) {// 一行一列视图
holder.iv_item_icon_single.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(mContext,"单列," + (position - 1) + "", 0).show();
}
});
}
}
}
@Override
public MyRecycleAdapterHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
View root = null;
// 头部
if (viewType == RecycleViewWithHead.HEADER_RECYCLER_VIEW_ITEM) {
root = headView;
} else {// 普通条目
/** 一行显示一条 */
if (viewType == RecycleViewWithHead.RECYCLER_VIEW_ITEM_SINGLE) {
root = LayoutInflater.from(mContext).inflate(R.layout.item_single, parent, false);
}
/** 一行显示两条 */
else {
root = LayoutInflater.from(mContext).inflate(R.layout.item_double, parent, false);
}
}
return new MyRecycleAdapterHolder(root, viewType);
}
/**
* 添加自定义头部
*/
public void addHeadView(View view) {
this.headView = view;
}
@Override
public int getItemViewType(int position) {
if (position == 0) {
return RecycleViewWithHead.HEADER_RECYCLER_VIEW_ITEM;
} else {
/** 一行显示一条 */
if (spanSize == RecycleViewWithHead.RECYCLER_VIEW_ITEM_SINGLE) {
return RecycleViewWithHead.RECYCLER_VIEW_ITEM_SINGLE;
/** 一行显示两条 */
} else {
return RecycleViewWithHead.RECYCLER_VIEW_ITEM_DOUBLE;
}
}
}
public int getSpanSize() {
return spanSize;
}
public void setSpanSize(int spanSize) {
this.spanSize = spanSize;
}
}
普通条目的ViewHolder
[java] view plain copy
print
?
1. import
2. import
3. import
4. import
5. import
6. import
7. import
8.
9. public class MyRecycleAdapterHolder extends
10. //一行两列视图
11. public
12. public
13.
14. //一行一列视图
15. public
16. public
17.
18. public
19. super(itemView);
20. }
21. public MyRecycleAdapterHolder(View itemView,int
22. super(itemView);
23. initView(itemView,viewType);
24. }
25. private void initView(View itemView, int
26. if(viewType == RecycleViewWithHead.RECYCLER_VIEW_ITEM_DOUBLE){
27. iv_item_icon = (ImageView) itemView.findViewById(R.id.iv_item_icon);
28. tv_item = (TextView) itemView.findViewById(R.id.tv_item);
29. else if(viewType == RecycleViewWithHead.RECYCLER_VIEW_ITEM_SINGLE){
30. iv_item_icon_single = (ImageView) itemView.findViewById(R.id.iv_item_icon_single);
31. tv_item_single = (TextView) itemView.findViewById(R.id.tv_item_single);
32. }
33. }
34. }
import com.example.myrecycleviewdemo.R;
import com.example.myrecycleviewdemo.R.id;
import com.example.myrecycleviewdemo.RecycleViewWithHead;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
public class MyRecycleAdapterHolder extends RecyclerView.ViewHolder{
//一行两列视图
public ImageView iv_item_icon;
public TextView tv_item;
//一行一列视图
public ImageView iv_item_icon_single;
public TextView tv_item_single;
public MyRecycleAdapterHolder(View itemView) {
super(itemView);
}
public MyRecycleAdapterHolder(View itemView,int viewType) {
super(itemView);
initView(itemView,viewType);
}
private void initView(View itemView, int viewType) {
if(viewType == RecycleViewWithHead.RECYCLER_VIEW_ITEM_DOUBLE){
iv_item_icon = (ImageView) itemView.findViewById(R.id.iv_item_icon);
tv_item = (TextView) itemView.findViewById(R.id.tv_item);
}else if(viewType == RecycleViewWithHead.RECYCLER_VIEW_ITEM_SINGLE){
iv_item_icon_single = (ImageView) itemView.findViewById(R.id.iv_item_icon_single);
tv_item_single = (TextView) itemView.findViewById(R.id.tv_item_single);
}
}
}
头布局文件head.xm没有任何变化
条目的布局拆分为2个item_double.xml和item_single.xml
item_double.xml和之前的item.xml一样。
item_single.xml
[html] view plain copy
print
?
1. <?xml version=“1.0” encoding=“utf-8”?>
2. <LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”
3. android:id=“@+id/ll_list”
4. android:layout_width=“wrap_content”
5. android:layout_height=“wrap_content”
6. android:layout_marginLeft=“2dp”
7. android:layout_marginRight=“2dp”
8. android:layout_marginTop=“5dp”
9. android:orientation=“horizontal” >
10.
11. <ImageView
12. android:id=“@+id/iv_item_icon_single”
13. android:layout_width=“wrap_content”
14. android:layout_height=“wrap_content”
15. android:src=“@drawable/item” />
16.
17. <TextView
18. android:id=“@+id/tv_item_single”
19. android:layout_width=“wrap_content”
20. android:layout_height=“wrap_content”
21. android:layout_gravity=“center_vertical”
22. android:layout_marginTop=“5dp”
23. android:text=“这是一只熊猫” />
24.
25. </LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ll_list"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="2dp"
android:layout_marginRight="2dp"
android:layout_marginTop="5dp"
android:orientation="horizontal" >
<ImageView
android:id="@+id/iv_item_icon_single"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/item" />
<TextView
android:id="@+id/tv_item_single"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginTop="5dp"
android:text="这是一只熊猫" />
</LinearLayout>
源码地址:http://download.csdn.NET/detail/linder_qzy/9491370
















