android 实现城市选择、联系人等功能的易拓展 RecyclerView 库,包含自动索引,粘性等功能

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u014608640/article/details/52848457

IndexableRecyclerView

简介:用于实现城市选择、联系人等功能的易拓展 RecyclerView 库,包含自动索引,粘性等功能

A RecyclerView with indexable, sticky and many other features.

轻松实现:选择城市,选择联系人等需要索引的功能

替代之前的 IndexableStickyListView(移至该分支),进行大幅度重构,性能优化,更易使用的 API,更易拓展的 HeaderView/FooterView 等等! 重构历程可以看这篇文章:[设计模式]记一次开源库的重构历程

Demo 演示

 

特性

1、根据数据源,自动排序生成字母索引 Bar(非字母开头,索引为"#",另可自由定制),以及 HeaderTitle

2、非常自由的 添加各种 HeaderView/FooterView,包括自定义索引,HeaderTitle,各种 View 等等

3、HeaderTitle 是粘性的(Sticky)

4、UI 自由定制、拓展;提供 2 种悬浮提示 View,常规居中 以及 MD 风格的右侧气泡

5、绑定数据源,通过单线程的线程池优化,不怕重复绑定数据

6、使用TinyPinyin代替 Pinyin4j.jar 库,体积更小,拼音转化速度提升 4 倍!

更新日志

1.0.4

添加 FooterView 功能

如何使用

gradle

项目下 app 的 build.gradle 中依赖:

 compile 'me.yokeyword:indexablerecyclerview:1.0.4'

 compile 'com.android.support:recyclerview-v7:你使用的版本号'

Xml

 <me.yokeyword.indexablerv.IndexableLayout
     ...
     app:indexBar_layout_width="24dp"           // IndexBar:width
     app:indexBar_background="#08000000"        // IndexBar:background
     app:indexBar_textColor="#000000"           // IndexBar:textColor
     app:indexBar_selectedTextColor="#f33737"   // IndexBar:isSelected textColor
     app:indexBar_textSize="14sp"               // IndexBar:textSize
     app:indexBar_textSpace="6dp" />            // IndexBar:text lineSpace

3 步集成

1、实体类实现 IndexableEntity

public class CityEntity implements IndexableEntity {
    ...
    private String name;
    private String pinyin;

    @Override
    public String getFieldIndexBy() {
        return name;  // return 你需要根据该属性排序的 field
    }

    @Override
    public void setFieldIndexBy(String indexByField) {
        this.name = indexByField; // 同上
    }

    @Override
    public void setFieldPinyinIndexBy(String pinyin) {
        this.pinyin = pinyin; // 保存排序 field 的拼音,在执行比如搜索等功能时有用 (若不需要,空实现该方法即可)
    }
}

2、继承 IndexAdapter

public class CityAdapter extends IndexableAdapter<CityEntity> {
    @Override
    public RecyclerView.ViewHolder onCreateTitleViewHolder(ViewGroup parent) {
        // 创建 TitleItem 布局
    }

    @Override
    public RecyclerView.ViewHolder onCreateContentViewHolder(ViewGroup parent) {
        // 创建 内容 Item 布局
    }

    @Override
    public void onBindTitleViewHolder(RecyclerView.ViewHolder holder, String indexTitle) {
         // 填充 TitleItem 布局
    }

    @Override
    public void onBindContentViewHolder(RecyclerView.ViewHolder holder, CityEntity entity) {
        // 填充 内容 Item 布局
    }
}

3、绑定视图和数据

CityAdapter adapter = new CityAdapter(this);
indexableLayout.setAdapter(adapter);
// 排序过程是异步的 另有 setDatas(mDatas,IndexCallback callback)  // callback 在 datas 异步排序结束后回调
adapter.setDatas(mDatas);
// 另有 setOnItemTitleClickListener(listener),点击 TitleItem 点击事件以及 LongClick
adapter.setOnItemContentClickListener(listener);

拓展

1、设置 索引悬浮提示框 风格

// 前者 Material Design 风格右侧气泡 , 后者 居中 IOS 风格气泡
indexableLayout.setOverlayStyle_MaterialDesign(int Color) & setOverlayStyle_Center()

2、多音字处理

多音字需要手动处理: 例如城市排序时, 拼音转化库默认重庆为 zhongqing, 对于这种情况你需要手动将源数据的 '重庆' 修改 为'#chongqing#重庆', 库会根据正则表达式进行对应的辨别处理(即 #多音字拼音#汉字 的格式)

3、添加自定义 HeaderView,FooterView

indexableLayout.addHeaderAdapter(IndexableHeaderAdapter adapter)    // 添加 HeaderView
indexableLayout.addFooterAdapter(IndexableFooterAdapter adapter)    // 添加 FooterView

// 3 个参数分别对应:IndexBar 的索引,HeaderTitle,传入的 Header 数据源,此处泛型 T 可以是任何实体类,不需要和主 Adapter 类型一致
// 如果不想显示某块视图,则传入 null 即可: 比如不想显示 HeaderTitle, 则 indexTitle 传入 null;
IndexableHeaderAdapter<T>(String index, String indexTitle, List<T> datas){
    // 需要实现 3 个方法:
    public abstract int getItemViewType(); // 每个 HeaderView 的 type 应当不同
    public abstract RecyclerView.ViewHolder onCreateContentViewHolder(ViewGroup parent);
    public abstract void onBindContentViewHolder(RecyclerView.ViewHolder holder, T entity);
}

// 如果想添加的 HeaderView,和主 Adapter 的布局完全一致,则可以使用:
new SimpleHeaderAdapter(IndexableAdapter<T> adapter, String index, String indexTitle, List<T> datas);

4、更改排序规则

默认根据全拼音排序,可根据需求更改为按首字母排序:

// 排序规则设置为:只按首字母  (默认全拼音排序,false)  效率很高,是默认的 10 倍左右。
indexableLayout.setFastCompare(true);

更多细节使用,参见 Demo

展开阅读全文

没有更多推荐了,返回首页