Skip to content
A RecyclerView with indexable, sticky and many other features.
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
gif Update GIF Oct 9, 2016
gradle/wrapper Update gradle Jul 5, 2017
indexablerecyclerview
sample 添加新的多音字处理示例;添加自定义排序规则示例 Jul 26, 2017
.gitignore
LICENSE
README.md Update to 1.3.0 Jul 26, 2017
build.gradle
gradle.properties initial Oct 9, 2016
gradlew initial Oct 9, 2016
gradlew.bat
settings.gradle update env Oct 8, 2016

README.md

IndexableRecyclerView

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.3.0

  • 多音字借助TinyPinyin处理
  • 可以自定义排序方式

1.2.4

  • Fix 数据变动时,StickTitle不及时更新问题;增加2处安全校验

1.2.0

1.0.7

  • 默认不再显示左侧的悬浮气泡
  • 默认排序方式改为快速排序,提供一个MODE_NONE的排序方式

1.0.5 为HeaderView/FooterView添加:

  • indexableLayout.removeHeaderAdapter();
  • headerAdapter.addData()
  • headerAdapter.removeData()

如何使用

gradle

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

 compile 'me.yokeyword:indexablerecyclerview:1.3.0'
 compile 'com.android.support:appcompat-v7:你使用的版本号'
 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、绑定视图和数据

// 支持LinearLayoutManager, GridLayoutManager
indexableLayout.setLayoutManager(LayoutManager);

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、多音字处理

多音字处理得益于使用了TinyPinyin,可以如下设置:

// 添加中文城市词典
Pinyin.init(Pinyin.newConfig().with(CnCityDict.getInstance());

// 添加自定义词典
Pinyin.init(Pinyin.newConfig()
            .with(new PinyinMapDict() {
                @Override
                public Map<String, String[]> mapping() {
                    HashMap<String, String[]> map = new HashMap<String, String[]>();
                    map.put("重庆",  new String[]{"CHONG", "QING"});
                    return map;
                }
            }));

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、更改排序规则

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

// 设置排序规则: 
// MODE_FAST:按首字母排序(默认);MODE_ALL_LETTERS:全字母比较,效率较低; MODE_NONE:字母模块内不排序,效率最高
indexableLayout.setCompareMode(@CompareMode int mode);

// 自定义排序规则
indexableLayout.setComparator(yourComparator);

更多细节使用,参见Demo

致谢

TinyPinyin

You can’t perform that action at this time.