{"id":15028180,"url":"https://github.com/yokeyword/indexablerecyclerview","last_synced_at":"2025-05-16T13:06:48.553Z","repository":{"id":37385067,"uuid":"54698371","full_name":"YoKeyword/IndexableRecyclerView","owner":"YoKeyword","description":"A RecyclerView with indexable, sticky and many other features.","archived":false,"fork":false,"pushed_at":"2018-04-10T07:45:05.000Z","size":15185,"stargazers_count":1327,"open_issues_count":41,"forks_count":241,"subscribers_count":37,"default_branch":"master","last_synced_at":"2025-04-12T09:19:49.748Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/YoKeyword.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-03-25T06:05:32.000Z","updated_at":"2025-03-18T02:02:31.000Z","dependencies_parsed_at":"2022-09-14T21:22:35.633Z","dependency_job_id":null,"html_url":"https://github.com/YoKeyword/IndexableRecyclerView","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/YoKeyword%2FIndexableRecyclerView","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/YoKeyword%2FIndexableRecyclerView/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/YoKeyword%2FIndexableRecyclerView/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/YoKeyword%2FIndexableRecyclerView/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/YoKeyword","download_url":"https://codeload.github.com/YoKeyword/IndexableRecyclerView/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254535829,"owners_count":22087399,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-09-24T20:07:44.950Z","updated_at":"2025-05-16T13:06:48.499Z","avatar_url":"https://github.com/YoKeyword.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# IndexableRecyclerView\nA RecyclerView with indexable, sticky and many other features.\n\n**轻松实现：选择城市，选择联系人等需要索引的功能**\n\n\u003e 替代之前的IndexableStickyListView(移至该[分支](https://github.com/YoKeyword/IndexableRecyclerView/tree/listview)),进行大幅度重构，性能优化，更易使用的API，更易拓展的HeaderView/FooterView等等！\n重构历程可以看这篇文章：[［设计模式］记一次开源库的重构历程](http://www.jianshu.com/p/2ee8706c346b)\n\n# Demo演示\n\u003cimg src=\"/gif/demo_city.gif\" width=\"320px\"/\u003e\n\u003cimg src=\"/gif/demo_contact.gif\" width=\"320px\"/\u003e\n\n# 特性\n1、根据数据源，自动**排序生成**字母索引Bar(非字母开头,索引为\"#\",另可自由定制)，以及HeaderTitle\n\n2、非常自由的 添加各种HeaderView／FooterView，包括自定义索引，HeaderTitle，各种View等等\n\n3、HeaderTitle是粘性的（Sticky）\n\n4、UI自由定制、拓展；提供2种悬浮提示View，常规居中 以及 MD风格的右侧气泡\n\n5、绑定数据源，通过单线程的线程池优化，不怕重复绑定数据\n\n6、使用[TinyPinyin](https://github.com/promeG/TinyPinyin)代替Pinyin4j.jar库，体积更小，拼音转化速度提升4倍！\n\n# 更新日志\n1.3.0\n* 多音字借助TinyPinyin处理\n* 可以自定义排序方式\n\n1.2.4\n* Fix 数据变动时，StickTitle不及时更新问题；增加2处安全校验\n\n1.2.0\n* 支持GridLayoutManager! (感谢[guodongAndroid](https://github.com/guodongAndroid))\n\n1.0.7\n* 默认不再显示左侧的悬浮气泡\n* 默认排序方式改为快速排序，提供一个MODE_NONE的排序方式\n\n1.0.5\n为HeaderView/FooterView添加:\n* `indexableLayout.removeHeaderAdapter();`\n* `headerAdapter.addData()`\n* `headerAdapter.removeData()`\n\n# 如何使用\n### gradle\n项目下app的build.gradle中依赖：\n````xml\n compile 'me.yokeyword:indexablerecyclerview:1.3.0'\n compile 'com.android.support:appcompat-v7:你使用的版本号'\n compile 'com.android.support:recyclerview-v7:你使用的版本号'\n````\n\n### Xml\n````xml\n \u003cme.yokeyword.indexablerv.IndexableLayout\n     ...\n     app:indexBar_layout_width=\"24dp\"           // IndexBar：width\n     app:indexBar_background=\"#08000000\"        // IndexBar：background\n     app:indexBar_textColor=\"#000000\"           // IndexBar：textColor\n     app:indexBar_selectedTextColor=\"#f33737\"   // IndexBar：isSelected textColor\n     app:indexBar_textSize=\"14sp\"               // IndexBar：textSize\n     app:indexBar_textSpace=\"6dp\" /\u003e            // IndexBar：text lineSpace\n````\n\n### 3步集成\n**1、实体类实现IndexableEntity**\n````java\npublic class CityEntity implements IndexableEntity {\n    ...\n    private String name;\n    private String pinyin;\n    \n    @Override\n    public String getFieldIndexBy() {\n        return name;  // return 你需要根据该属性排序的field\n    }\n\n    @Override\n    public void setFieldIndexBy(String indexByField) {\n        this.name = indexByField; // 同上\n    }\n\n    @Override\n    public void setFieldPinyinIndexBy(String pinyin) {\n        this.pinyin = pinyin; // 保存排序field的拼音,在执行比如搜索等功能时有用 （若不需要，空实现该方法即可）\n    }\n}\n````\n\n**2、继承IndexAdapter**\n````java\npublic class CityAdapter extends IndexableAdapter\u003cCityEntity\u003e {\n    @Override\n    public RecyclerView.ViewHolder onCreateTitleViewHolder(ViewGroup parent) {\n        // 创建 TitleItem 布局\n    }\n\n    @Override\n    public RecyclerView.ViewHolder onCreateContentViewHolder(ViewGroup parent) {\n        // 创建 内容Item 布局\n    }\n\n    @Override\n    public void onBindTitleViewHolder(RecyclerView.ViewHolder holder, String indexTitle) {\n         // 填充 TitleItem 布局\n    }\n\n    @Override\n    public void onBindContentViewHolder(RecyclerView.ViewHolder holder, CityEntity entity) {\n        // 填充 内容Item 布局\n    }\n}\n````\n\n**3、绑定视图和数据**\n````java\n// 支持LinearLayoutManager, GridLayoutManager\nindexableLayout.setLayoutManager(LayoutManager);\n\nCityAdapter adapter = new CityAdapter(this);\nindexableLayout.setAdapter(adapter);\n// 排序过程是异步的 另有setDatas(mDatas,IndexCallback callback)  // callback在datas异步排序结束后回调\nadapter.setDatas(mDatas);\n// 另有setOnItemTitleClickListener(listener)，点击TitleItem点击事件以及LongClick\nadapter.setOnItemContentClickListener(listener);\n````\n\n# 拓展\n### 1、设置 索引悬浮提示框 风格\n````java\n// 前者Material Design风格右侧气泡 ， 后者 居中 IOS风格气泡\nindexableLayout.setOverlayStyle_MaterialDesign(int Color) \u0026 setOverlayStyle_Center()\n````\n\n### 2、多音字处理\n\n多音字处理得益于使用了[TinyPinyin](https://github.com/promeG/TinyPinyin)，可以如下设置：\n````java\n// 添加中文城市词典\nPinyin.init(Pinyin.newConfig().with(CnCityDict.getInstance());\n\n// 添加自定义词典\nPinyin.init(Pinyin.newConfig()\n            .with(new PinyinMapDict() {\n                @Override\n                public Map\u003cString, String[]\u003e mapping() {\n                    HashMap\u003cString, String[]\u003e map = new HashMap\u003cString, String[]\u003e();\n                    map.put(\"重庆\",  new String[]{\"CHONG\", \"QING\"});\n                    return map;\n                }\n            }));\n````\n\n### 3、添加自定义HeaderView，FooterView\n````java\nindexableLayout.addHeaderAdapter(IndexableHeaderAdapter adapter)    // 添加HeaderView\nindexableLayout.addFooterAdapter(IndexableFooterAdapter adapter)    // 添加FooterView\n\n// 3个参数分别对应:IndexBar的索引,HeaderTitle,传入的Header数据源,此处泛型T可以是任何实体类,不需要和主Adapter类型一致\n// 如果不想显示某块视图，则传入null即可： 比如不想显示 HeaderTitle， 则indexTitle传入null；\nIndexableHeaderAdapter\u003cT\u003e(String index, String indexTitle, List\u003cT\u003e datas){\n    // 需要实现3个方法：\n    public abstract int getItemViewType(); // 每个HeaderView的type应当不同\n    public abstract RecyclerView.ViewHolder onCreateContentViewHolder(ViewGroup parent);\n    public abstract void onBindContentViewHolder(RecyclerView.ViewHolder holder, T entity);\n}\n\n// 如果想添加的HeaderView，和主Adapter的布局完全一致，则可以使用:\nnew SimpleHeaderAdapter(IndexableAdapter\u003cT\u003e adapter, String index, String indexTitle, List\u003cT\u003e datas);\n````\n\n### 4、更改排序规则\n默认根据**全拼音排序**，可根据需求更改为**按首字母排序**:\n````java\n// 设置排序规则： \n// MODE_FAST:按首字母排序（默认）；MODE_ALL_LETTERS:全字母比较，效率较低； MODE_NONE:字母模块内不排序，效率最高\nindexableLayout.setCompareMode(@CompareMode int mode);\n\n// 自定义排序规则\nindexableLayout.setComparator(yourComparator);\n````\n\n\u003e 更多细节使用，参见Demo\n\n## 致谢\n\n[TinyPinyin](https://github.com/promeG/TinyPinyin)\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyokeyword%2Findexablerecyclerview","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyokeyword%2Findexablerecyclerview","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyokeyword%2Findexablerecyclerview/lists"}