当前位置:   article > 正文

Android RecyclerView增加头部Header和尾部Footer,并实现Item分组

android extendheader
Android RecyclerView增加头部Header和尾部Footer,并实现Item分组


如图所示:





在Android的RecyclerView上实现增加若干头部Header和若干尾部Footer,关键是利用ViewType的类型,然后由本例的抽象类Item返回的类型加载不同的ViewHolder。
代码:
  1. package app.zhangphil.exp;
  2. import android.graphics.Color;
  3. import android.support.v7.app.AppCompatActivity;
  4. import android.os.Bundle;
  5. import android.support.v7.widget.LinearLayoutManager;
  6. import android.support.v7.widget.RecyclerView;
  7. import android.view.LayoutInflater;
  8. import android.view.View;
  9. import android.view.ViewGroup;
  10. import android.widget.TextView;
  11. import java.util.ArrayList;
  12. public class MainActivity extends AppCompatActivity {
  13. private final int TYPE_HEADER = 0xa00;
  14. private final int TYPE_GROUP = 0xa01;
  15. private final int TYPE_CHILD = 0xa02;
  16. private final int TYPE_FOOTER = 0xa03;
  17. private RecyclerViewAdapter mAdapter;
  18. @Override
  19. protected void onCreate(Bundle savedInstanceState) {
  20. super.onCreate(savedInstanceState);
  21. setContentView(R.layout.activity_main);
  22. RecyclerView recyclerView = findViewById(R.id.recycler_view);
  23. LinearLayoutManager layoutManage = new LinearLayoutManager(this);
  24. layoutManage.setOrientation(LinearLayoutManager.VERTICAL);
  25. recyclerView.setLayoutManager(layoutManage);
  26. mAdapter = new RecyclerViewAdapter();
  27. recyclerView.setAdapter(mAdapter);
  28. String[] groupNames = {"A", "B", "C", "D", "E", "F", "G"};
  29. for (int i = 0; i < groupNames.length; i++) {
  30. Group group = new Group();
  31. group.id = i;
  32. group.title = groupNames[i];
  33. mAdapter.addItem(group);
  34. int count = (int) (Math.random() * 10) % 3;
  35. for (int j = 0; j < count; j++) {
  36. Child child = new Child();
  37. child.position = j;
  38. child.group = group;
  39. mAdapter.addItem(child);
  40. }
  41. }
  42. addHeader();
  43. addFooter();
  44. }
  45. private void addHeader() {
  46. for (int i = 0; i < 3; i++) {
  47. HeaderItem headerItem = new HeaderItem();
  48. headerItem.id = i;
  49. mAdapter.addItem(i, headerItem); //增加一个头部,可以增加多个
  50. }
  51. }
  52. private void addFooter() {
  53. for (int i = 0; i < 3; i++) {
  54. FooterItem footerItem = new FooterItem();
  55. footerItem.id = i;
  56. mAdapter.addItem(footerItem); //增加一个尾部,可以增加多个
  57. }
  58. }
  59. public class RecyclerViewAdapter extends RecyclerView.Adapter<ItemVH> {
  60. private ArrayList<Item> items;
  61. public RecyclerViewAdapter() {
  62. items = new ArrayList<>();
  63. }
  64. @Override
  65. public ItemVH onCreateViewHolder(ViewGroup parent, int viewType) {
  66. View view;
  67. ItemVH itemVH = null;
  68. switch (viewType) {
  69. case TYPE_HEADER:
  70. view = LayoutInflater.from(parent.getContext()).inflate(android.R.layout.simple_list_item_1, parent, false);
  71. itemVH = new HeaderVH(view);
  72. break;
  73. case TYPE_FOOTER:
  74. view = LayoutInflater.from(parent.getContext()).inflate(android.R.layout.simple_list_item_1, parent, false);
  75. itemVH = new FooterVH(view);
  76. break;
  77. case TYPE_GROUP:
  78. view = LayoutInflater.from(parent.getContext()).inflate(android.R.layout.simple_list_item_1, parent, false);
  79. itemVH = new GroupVH(view);
  80. break;
  81. case TYPE_CHILD:
  82. view = LayoutInflater.from(parent.getContext()).inflate(android.R.layout.simple_list_item_2, parent, false);
  83. itemVH = new ChildVH(view);
  84. break;
  85. }
  86. return itemVH;
  87. }
  88. @Override
  89. public void onBindViewHolder(ItemVH holder, int position) {
  90. Item item = items.get(position);
  91. switch (getItemViewType(position)) {
  92. case TYPE_HEADER:
  93. HeaderItem headerItem = (HeaderItem) items.get(position);
  94. HeaderVH headerVH = (HeaderVH) holder;
  95. headerVH.text.setText("第" + headerItem.id + "个头部");
  96. break;
  97. case TYPE_FOOTER:
  98. FooterItem footerItem = (FooterItem) items.get(position);
  99. FooterVH footerVH = (FooterVH) holder;
  100. footerVH.text.setText("第" + footerItem.id + "个尾部");
  101. break;
  102. case TYPE_GROUP:
  103. Group g = (Group) item;
  104. GroupVH groupVH = (GroupVH) holder;
  105. groupVH.text.setText(g.title);
  106. break;
  107. case TYPE_CHILD:
  108. Child c = (Child) item;
  109. ChildVH childVH = (ChildVH) holder;
  110. childVH.text1.setText(c.group.title);
  111. childVH.text2.setText(c.position + "");
  112. break;
  113. }
  114. }
  115. @Override
  116. public int getItemCount() {
  117. return items.size();
  118. }
  119. @Override
  120. public int getItemViewType(int position) {
  121. return items.get(position).getType();
  122. }
  123. public void addItem(Item item) {
  124. items.add(item);
  125. }
  126. public void addItem(int position, Item item) {
  127. items.add(position, item);
  128. }
  129. }
  130. private class Group extends Item {
  131. public String title;
  132. @Override
  133. public int getType() {
  134. return TYPE_GROUP;
  135. }
  136. }
  137. private class Child extends Item {
  138. public Group group;
  139. @Override
  140. public int getType() {
  141. return TYPE_CHILD;
  142. }
  143. }
  144. private abstract class Item {
  145. public int position;
  146. public int id;
  147. public abstract int getType();
  148. }
  149. private class FooterItem extends Item {
  150. @Override
  151. public int getType() {
  152. return TYPE_FOOTER;
  153. }
  154. }
  155. private class FooterVH extends ItemVH {
  156. public TextView text;
  157. public FooterVH(View itemView) {
  158. super(itemView);
  159. text = itemView.findViewById(android.R.id.text1);
  160. itemView.setBackgroundColor(Color.LTGRAY);
  161. }
  162. @Override
  163. public int getType() {
  164. return TYPE_FOOTER;
  165. }
  166. }
  167. private class HeaderItem extends Item {
  168. @Override
  169. public int getType() {
  170. return TYPE_HEADER;
  171. }
  172. }
  173. private class HeaderVH extends ItemVH {
  174. public TextView text;
  175. public HeaderVH(View itemView) {
  176. super(itemView);
  177. text = itemView.findViewById(android.R.id.text1);
  178. itemView.setBackgroundColor(Color.LTGRAY);
  179. }
  180. @Override
  181. public int getType() {
  182. return TYPE_HEADER;
  183. }
  184. }
  185. private class GroupVH extends ItemVH {
  186. public TextView text;
  187. public GroupVH(View itemView) {
  188. super(itemView);
  189. text = itemView.findViewById(android.R.id.text1);
  190. text.setBackgroundColor(Color.RED);
  191. }
  192. @Override
  193. public int getType() {
  194. return TYPE_GROUP;
  195. }
  196. }
  197. private class ChildVH extends ItemVH {
  198. public TextView text1;
  199. public TextView text2;
  200. public ChildVH(View itemView) {
  201. super(itemView);
  202. text1 = itemView.findViewById(android.R.id.text1);
  203. text2 = itemView.findViewById(android.R.id.text2);
  204. text1.setTextColor(Color.LTGRAY);
  205. text2.setTextColor(Color.BLUE);
  206. }
  207. @Override
  208. public int getType() {
  209. return TYPE_CHILD;
  210. }
  211. }
  212. private abstract class ItemVH extends RecyclerView.ViewHolder {
  213. public ItemVH(View itemView) {
  214. super(itemView);
  215. }
  216. public abstract int getType();
  217. }
  218. }



声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/306274
推荐阅读
相关标签
  

闽ICP备14008679号