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

简介: Android RecyclerView增加头部Header和尾部Footer,并实现Item分组如图所示:在Android的RecyclerView上实现增加若干头部Header和若干尾部Footer,关键是利用ViewType的类型,然后由本例的抽象类Item返回的类型加载不同的ViewHolder。
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();
    }
}



相关文章
|
4月前
|
Android开发 开发者 索引
Android实战经验之如何使用DiffUtil提升RecyclerView的刷新性能
本文介绍如何使用 `DiffUtil` 实现 `RecyclerView` 数据集的高效更新,避免不必要的全局刷新,尤其适用于处理大量数据场景。通过定义 `DiffUtil.Callback`、计算差异并应用到适配器,可以显著提升性能。同时,文章还列举了常见错误及原因,帮助开发者避免陷阱。
319 9
|
4月前
|
存储 缓存 Android开发
Android RecyclerView 缓存机制深度解析与面试题
本文首发于公众号“AntDream”,详细解析了 `RecyclerView` 的缓存机制,包括多级缓存的原理与流程,并提供了常见面试题及答案。通过本文,你将深入了解 `RecyclerView` 的高性能秘诀,提升列表和网格的开发技能。
85 8
|
3月前
|
Android开发
Android开发显示头部Bar的需求解决方案--Android应用实战
Android开发显示头部Bar的需求解决方案--Android应用实战
32 0
|
5月前
|
存储 Android开发 开发者
Android项目架构设计问题之定义RecyclerView的ViewHolder如何解决
Android项目架构设计问题之定义RecyclerView的ViewHolder如何解决
60 0
|
5月前
|
数据可视化 Java 数据挖掘
Android项目架构设计问题之设置RecyclerView的LayoutManager如何解决
Android项目架构设计问题之设置RecyclerView的LayoutManager如何解决
42 0
|
7月前
|
Android开发 UED
Android Item平移动画
【6月更文挑战第18天】
123 8
|
7月前
|
API Android开发 开发者
`RecyclerView`是Android API 21引入的UI组件,用于替代ListView和GridView
【6月更文挑战第26天】`RecyclerView`是Android API 21引入的UI组件,用于替代ListView和GridView。它提供高效的数据视图复用,优化的布局管理,支持多种布局(如线性、网格),并解耦数据、适配器和视图。RecyclerView的灵活性、性能(如局部刷新和动画支持)和扩展性使其成为现代Android开发的首选,特别是在处理大规模数据集时。
80 2
|
7月前
|
XML Java Android开发
Android RecyclerView用代码动态设置item的selector
Android RecyclerView用代码动态设置item的selector
52 0
|
索引
Android--listView中的button控件获取item的值
版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/chaoyu168/article/details/55253877 在listv...
1224 0
|
1月前
|
搜索推荐 前端开发 API
探索安卓开发中的自定义视图:打造个性化用户界面
在安卓应用开发的广阔天地中,自定义视图是一块神奇的画布,让开发者能够突破标准控件的限制,绘制出独一无二的用户界面。本文将带你走进自定义视图的世界,从基础概念到实战技巧,逐步揭示如何在安卓平台上创建和运用自定义视图来提升用户体验。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开新的视野,让你的应用在众多同质化产品中脱颖而出。
55 19