# IndexableRecyclerViewX
**Repository Path**: androidx_xy/IndexableRecyclerViewX
## Basic Information
- **Project Name**: IndexableRecyclerViewX
- **Description**: 这是 IndexableRecyclerView 库的androidx版本
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 6
- **Forks**: 1
- **Created**: 2022-06-07
- **Last Updated**: 2023-02-08
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# IndexableRecyclerViewX
#### 介绍
IndexableRecyclerView 库的androidx版本
#### 软件架构
替代之前的IndexableStickyListView,进行大幅度重构,性能优化,更易使用的API,更易拓展的HeaderView/FooterView等等!
#### 引入
```
repositories {
mavenCentral()
maven { url "https://jitpack.io" }
}
```
```
implementation 'com.gitee.androidx_xy:IndexableRecyclerViewX:1.1'
```
#### XML
```
// IndexBar:text lineSpace
```
#### 3步集成
```
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的拼音,在执行比如搜索等功能时有用 (若不需要,空实现该方法即可)
}
}
```
### 继承IndexAdapter
```
public class CityAdapter extends IndexableAdapter {
@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 布局
}
}
```
### 绑定视图和数据
```
// 支持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);
```
##### 拓展
### 设置 索引悬浮提示框 风格
```
// 前者Material Design风格右侧气泡 , 后者 居中 IOS风格气泡
indexableLayout.setOverlayStyle_MaterialDesign(int Color) & setOverlayStyle_Center()
```
### 多音字处理
多音字处理得益于使用了[TinyPinyin](https://github.com/promeG/TinyPinyin),可以如下设置:
```
// 添加中文城市词典
Pinyin.init(Pinyin.newConfig().with(CnCityDict.getInstance());
// 添加自定义词典
Pinyin.init(Pinyin.newConfig()
.with(new PinyinMapDict() {
@Override
public Map mapping() {
HashMap map = new HashMap();
map.put("重庆", new String[]{"CHONG", "QING"});
return map;
}
}));
```
### 添加自定义HeaderView,FooterView
```
indexableLayout.addHeaderAdapter(IndexableHeaderAdapter adapter) // 添加HeaderView
indexableLayout.addFooterAdapter(IndexableFooterAdapter adapter) // 添加FooterView
// 3个参数分别对应:IndexBar的索引,HeaderTitle,传入的Header数据源,此处泛型T可以是任何实体类,不需要和主Adapter类型一致
// 如果不想显示某块视图,则传入null即可: 比如不想显示 HeaderTitle, 则indexTitle传入null;
IndexableHeaderAdapter(String index, String indexTitle, List 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 adapter, String index, String indexTitle, List datas);
```
### 更改排序规则
默认根据全拼音排序,可根据需求更改为按首字母排序:
```
// 设置排序规则:
// MODE_FAST:按首字母排序(默认);MODE_ALL_LETTERS:全字母比较,效率较低; MODE_NONE:字母模块内不排序,效率最高
indexableLayout.setCompareMode(@CompareMode int mode);
// 自定义排序规则
indexableLayout.setComparator(yourComparator);
```
#### 致谢
[IndexableRecyclerView support版](https://github.com/YoKeyword/IndexableRecyclerView)
[TinyPinyin](https://github.com/promeG/TinyPinyin)
[快速访问 in China](https://gitee.com/androidx_xy/IndexableRecyclerViewX)