Skip to content

添加 Header Footer

DONG edited this page Oct 23, 2019 · 3 revisions

创建 Header/Footer

需要继承 BaseSectionHeaderFooter<T>, T 为外部可能需要传入的数据类型. 若无外部数据传入, 可省略.

以下例子为创建一个可复用 Footer, 外部传入显示的 String 类型的标题 mTitle:

public class CustomFooterProvider extends BaseSectionHeaderFooter<String> {

    private String mTitle;
  
    public CustomFooterProvider(Context context) {
        super(context);
    }

    @Override
    public int getLayout() {
        return R.layout.item_footer;
    }

    @Override
    public void onBind(BaseViewHolder holder, IndexPath indexPath) {
        holder.setText(R.id.tv_title, mTitle); // 设置标题内容
    }
    
    // 指定泛型为 <String> 类型后, 可主动覆写 setData 方法
    @Override
    public void setData(String newData) {
        this.mTitle = newData;
    }
}

用户也可自定义数据传入的方法. 这里使用泛型和覆写 setData(T newData) 方法是为了统一数据传入 Provider 的入口. 所有开发人员建议都遵循这一个规定. 易于代码的阅读和维护.

将 Header/Footer 设置给对应的 Section

在 Adapter 中设置给相应的 Section 的 Provider:

mDemoItemProvider.setHeader(mCustomHeaderProvider);
mDemoItemProvider.setFooter(mCustomFooterProvider);

监听事件

Header/Footer 中添加监听事件, 这里使用 Demo 中 NewsHeaderProvider 为例:

public class NewsHeaderProvider extends BaseSectionHeaderFooter<String> {
   
    // 监听接口定义在 Provider 内部
    public interface NewsHeaderProviderListener {
        void onNotifyHeaderClick();
        void onNotifyFooterClick();
    };

    private NewsHeaderProviderListener mListener;

    private String mTitle;

    public NewsHeaderProvider(Context context) {
        super(context);
    }

    @Override
    public int getLayout() {
        return R.layout.item_complex_news_header;
    }

    @Override
    public void onBind(BaseViewHolder holder, IndexPath indexPath) {
        holder.setText(R.id.tv_title, mTitle);
        holder.setClick(R.id.btn_add_one, this, indexPath); // 设置按钮点击事件
        holder.setClick(R.id.btn_add_two, this, indexPath);
    }

    @Override
    public void onClick(BaseViewHolder holder, IndexPath indexPath, int viewId) {
        switch (viewId) {
            case R.id.btn_add_one:
                if (mListener != null) mListener.onNotifyHeaderClick();
                break;
            case R.id.btn_add_two:
                if (mListener != null) mListener.onNotifyFooterClick();
                break;
        }
    }
    
    // 在 Adapter 中传入监听实现
    public void setListener(NewsHeaderProviderListener listener) {
        this.mListener = listener;
    }

    @Override
    public void setData(String newData) {
        this.mTitle = newData;
    }
}