Android RecyclerView增加头部Header和尾部Footer,并实现Item分组
如图所示:
在Android的RecyclerView上实现增加若干头部Header和若干尾部Footer,关键是利用ViewType的类型,然后由本例的抽象类Item返回的类型加载不同的ViewHolder。
代码:
package app.zhangphil.exp;
import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
private final int TYPE_HEADER = 0xa00;
private final int TYPE_GROUP = 0xa01;
private final int TYPE_CHILD = 0xa02;
private final int TYPE_FOOTER = 0xa03;
private RecyclerViewAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RecyclerView recyclerView = findViewById(R.id.recycler_view);
LinearLayoutManager layoutManage = new LinearLayoutManager(this);
layoutManage.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(layoutManage);
mAdapter = new RecyclerViewAdapter();
recyclerView.setAdapter(mAdapter);
String[] groupNames = {"A", "B", "C", "D", "E", "F", "G"};
for (int i = 0; i < groupNames.length; i++) {
Group group = new Group();
group.id = i;
group.title = groupNames[i];
mAdapter.addItem(group);
int count = (int) (Math.random() * 10) % 3;
for (int j = 0; j < count; j++) {
Child child = new Child();
child.position = j;
child.group = group;
mAdapter.addItem(child);
}
}
addHeader();
addFooter();
}
private void addHeader() {
for (int i = 0; i < 3; i++) {
HeaderItem headerItem = new HeaderItem();
headerItem.id = i;
mAdapter.addItem(i, headerItem); //增加一个头部,可以增加多个
}
}
private void addFooter() {
for (int i = 0; i < 3; i++) {
FooterItem footerItem = new FooterItem();
footerItem.id = i;
mAdapter.addItem(footerItem); //增加一个尾部,可以增加多个
}
}
public class RecyclerViewAdapter extends RecyclerView.Adapter<ItemVH> {
private ArrayList<Item> items;
public RecyclerViewAdapter() {
items = new ArrayList<>();
}
@Override
public ItemVH onCreateViewHolder(ViewGroup parent, int viewType) {
View view;
ItemVH itemVH = null;
switch (viewType) {
case TYPE_HEADER:
view = LayoutInflater.from(parent.getContext()).inflate(android.R.layout.simple_list_item_1, parent, false);
itemVH = new HeaderVH(view);
break;
case TYPE_FOOTER:
view = LayoutInflater.from(parent.getContext()).inflate(android.R.layout.simple_list_item_1, parent, false);
itemVH = new FooterVH(view);
break;
case TYPE_GROUP:
view = LayoutInflater.from(parent.getContext()).inflate(android.R.layout.simple_list_item_1, parent, false);
itemVH = new GroupVH(view);
break;
case TYPE_CHILD:
view = LayoutInflater.from(parent.getContext()).inflate(android.R.layout.simple_list_item_2, parent, false);
itemVH = new ChildVH(view);
break;
}
return itemVH;
}
@Override
public void onBindViewHolder(ItemVH holder, int position) {
Item item = items.get(position);
switch (getItemViewType(position)) {
case TYPE_HEADER:
HeaderItem headerItem = (HeaderItem) items.get(position);
HeaderVH headerVH = (HeaderVH) holder;
headerVH.text.setText("第" + headerItem.id + "个头部");
break;
case TYPE_FOOTER:
FooterItem footerItem = (FooterItem) items.get(position);
FooterVH footerVH = (FooterVH) holder;
footerVH.text.setText("第" + footerItem.id + "个尾部");
break;
case TYPE_GROUP:
Group g = (Group) item;
GroupVH groupVH = (GroupVH) holder;
groupVH.text.setText(g.title);
break;
case TYPE_CHILD:
Child c = (Child) item;
ChildVH childVH = (ChildVH) holder;
childVH.text1.setText(c.group.title);
childVH.text2.setText(c.position + "");
break;
}
}
@Override
public int getItemCount() {
return items.size();
}
@Override
public int getItemViewType(int position) {
return items.get(position).getType();
}
public void addItem(Item item) {
items.add(item);
}
public void addItem(int position, Item item) {
items.add(position, item);
}
}
private class Group extends Item {
public String title;
@Override
public int getType() {
return TYPE_GROUP;
}
}
private class Child extends Item {
public Group group;
@Override
public int getType() {
return TYPE_CHILD;
}
}
private abstract class Item {
public int position;
public int id;
public abstract int getType();
}
private class FooterItem extends Item {
@Override
public int getType() {
return TYPE_FOOTER;
}
}
private class FooterVH extends ItemVH {
public TextView text;
public FooterVH(View itemView) {
super(itemView);
text = itemView.findViewById(android.R.id.text1);
itemView.setBackgroundColor(Color.LTGRAY);
}
@Override
public int getType() {
return TYPE_FOOTER;
}
}
private class HeaderItem extends Item {
@Override
public int getType() {
return TYPE_HEADER;
}
}
private class HeaderVH extends ItemVH {
public TextView text;
public HeaderVH(View itemView) {
super(itemView);
text = itemView.findViewById(android.R.id.text1);
itemView.setBackgroundColor(Color.LTGRAY);
}
@Override
public int getType() {
return TYPE_HEADER;
}
}
private class GroupVH extends ItemVH {
public TextView text;
public GroupVH(View itemView) {
super(itemView);
text = itemView.findViewById(android.R.id.text1);
text.setBackgroundColor(Color.RED);
}
@Override
public int getType() {
return TYPE_GROUP;
}
}
private class ChildVH extends ItemVH {
public TextView text1;
public TextView text2;
public ChildVH(View itemView) {
super(itemView);
text1 = itemView.findViewById(android.R.id.text1);
text2 = itemView.findViewById(android.R.id.text2);
text1.setTextColor(Color.LTGRAY);
text2.setTextColor(Color.BLUE);
}
@Override
public int getType() {
return TYPE_CHILD;
}
}
private abstract class ItemVH extends RecyclerView.ViewHolder {
public ItemVH(View itemView) {
super(itemView);
}
public abstract int getType();
}
}

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
Android 实现无网络传输文件(3)
系列文章:Android 实现无网络传输文件(1)Android 实现无网络传输文件(2) 在第一篇文章里,我介绍了如何通过 Wifi Direct 实现 Android 设备之间隔空传输文件的功能,在第二篇文章里,我将传输方法改为通过Wifi热点的方式来传输文件 这里,我修复了第二种方法中的一些bug,且提供的传输信息更为丰富,下图展示的就是文章发送端的传输信息 提供的信息有:传输总耗时、瞬时传输速率、平均传输速率、预估完成时间、传输进度等,具体的开发思路还是和上一篇文章一样,这里不再赘述 项目主页:WifiFileTransfer 我的GitHub主页:leavesC
-
下一篇
动画必须有(一): 属性动画浅谈
目录 前言 ObjectAnimator的初步使用 用AnimatorSet进行动画混合 将动画写在xml中 动画监听 ViewPropertyAnimator上手 最后 前言 官方文档传送门 属性动画是非常非常好用的, 谷歌自己都说这是一个强大的框架. 那今天就来了解一下它. ObjectAnimator的初步使用 属性动画最大的特点就是可以让任何Object动起来, 我先给个小栗子, 大家感受一下. TextView tvTest = (TextView) findViewById(R.id.tv_test); float curTranslationY = tvTest.getTranslationY(); ObjectAnimator animator = ObjectAnimator.ofFloat(tvTest, "translationY", curTranslationY, curTranslationY + 100f); animator.setDuration(2000); animator.start(); 栗子 属性动画有个很重要的点就是说, 动画过后, 控件本...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker容器配置,解决镜像无法拉取问题
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- 2048小游戏-低调大师作品
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- MySQL数据库在高并发下的优化方案