开源项目GridViewWithHeaderAndFooter使用和源码分析

GridViewWithHeaderAndFooter控件,可以像使用ListView一样为GridView添加Header和Footer。

项目地址:
https://github.com/liaohuqiu/android-GridViewWithHeaderAndFooter

效果图:


一、项目使用

(1).项目引用。

dependencies {
    compile 'in.srain.cube:grid-view-with-header-footer:1.0.12'
}
(2).添加Java代码。
GridViewWithHeaderAndFooter gridView = (GridViewWithHeaderAndFooter) v.findViewById(R.id.gridview);

LayoutInflater layoutInflater = LayoutInflater.from(this);
View headerView = layoutInflater.inflate(R.layout.header_view, null);
View footerView = layoutInflater.inflate(R.layout.footer_view, null);
gridView.addHeaderView(headerView);// 添加Header
gridView.addFooterView(footerView);// 添加Footer
注意,addHeaderView()和addFooterView()需要在setAdapter()方法之前调用。


二、源码分析
(1).实现原理:
当为ListView或GridView设置数据时,一般是创建一个自己的adapter继承自BaseAdapter类,然后调用setAdapter(ListAdapter adapter)方法。setAdapter()接收的是一个ListAdapter类型对象,而ListAdapter是一个接口,BaseAdapter类正是实现了ListAdapter接口。

ListView默认是拥有addHeaderView()和addFooterView()方法的,主要依靠的是android.widget.HeaderViewListAdapter类。HeaderViewListAdapter的主要作用是在ListAdapter基础上封装和升级,提供了添加Header和Footer的功能。该类一般不直接使用,它的主要目的是提供一个对包含Header和Footer的列表进行适配的一个类。HeaderViewListAdapter类实现了WrapperListAdapter接口。

来看WrapperListAdapter接口的定义。

package android.widget;

public interface WrapperListAdapter extends ListAdapter {
    public ListAdapter getWrappedAdapter();
}
WrapperListAdapter继承自ListAdapder接口,所以本身也是一个ListAdapter。同时内部嵌套了另一个ListAdapter,定义了一个方法用于取得嵌套的ListAdapter。

HeaderViewListAdapter类的成员变量和构造方法如下,这里只附上我们需要关心的部分。
构造方法的参数中,传入了headerView集合和footerView集合,另外还有一个adapter对象,这个adapter管理的就是真正的列表数据。

public class HeaderViewListAdapter implements WrapperListAdapter {
    private final ListAdapter mAdapter;
    ArrayList<ListView.FixedViewInfo> mHeaderViewInfos;
    ArrayList<ListView.FixedViewInfo> mFooterViewInfos;
    public HeaderViewListAdapter(ArrayList<ListView.FixedViewInfo> headerViewInfos,
                                 ArrayList<ListView.FixedViewInfo> footerViewInfos,
                                 ListAdapter adapter) {
        mAdapter = adapter;
        mHeaderViewInfos = headerViewInfos;
        mFooterViewInfos = footerViewInfos;
    }
}
再来看看ListView类的addHeaderView()方法,同样只附上我们需要关心的部分。
mAdapter成员变量是通过setAdapter()方法传入进来的,当调用了addHeaderView()方法时,将headerView添加到集合mHeaderViewInfos中,再创建一个HeaderViewListA
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值