以下为原生实现 如果你的富文本编辑更复杂可转看
Edittext实现功能
1.每插入一个序号累加
2.中间插入序号,后面的序号相应递增
3.中间删除序号,后面的序号相应递减
4.删除定义的有序列表样子整个删除 如<66> 删除“>”则整个删除
*不是最简单算法,我的最后一步是先替换成中间统一标签-1,然后再排序
本文以“·number、样式的有序列表为例(我现在项目需求是这样的~),也可以替换成<number>”纯数字也可看需求规则是什么
核心正则
//让符合规则序号重新排列
public String getOrderedList(String string) {
String pattern = "·-\\d+、|·\\d+、";
//先重置
string = string.replaceAll(pattern, "·" + -1 + "、");
//后排序
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(string);
int i = 0;
while (m.find()) {
String rep = "·" + ++i + "、";//实际增加长度
string = string.replaceFirst(m.group(), rep);
}
return string;
}
public String clearUnOrderedList(String string) {//不符合样式的皆删除
String pattern = "·\\d+[^、]|[^·]\\d+、";
string = string.replaceAll(pattern, "");
return string;
}
功能1:普通增加
private void addPoint() {
String order_tag = "\n\n·" + -1 + "、";//换两行方便看\n
int pStart = etChat.getSelectionStart();//获取光标位置point
int oldLen = etChat.getText().toString().length();
etChat.getText().insert(pStart, order_tag);
etChat.setText(getOrderedList(etChat.getText().toString()));
int newLen = etChat.getText().toString().length();
//移动光标实际增加距离
etChat.setSelection(pStart + newLen - oldLen);
}
功能2:中间插入
getOrderedList中已经实现,不该什么变化先占一个位置,后面统一排序
string = string.replaceAll(pattern, "·" + -1 + "、");
功能3,4:删除中间排序,删除样式的一部分则整个删除
etChat.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (before>0) {
int pStart = etChat.getSelectionStart();
int oldLen = s.toString().length();
etChat.needChange();
String newStr = clearUnOrderedList(s.toString());
String orderedList = getOrderedList(newStr);
int newLen = orderedList.length();
etChat.setText(orderedList);
etChat.setSelection(pStart + newLen - oldLen);
}
}
@Override
public void afterTextChanged(Editable s) {
}
});