Я написал свою собственную логику для добавления верхнего индекса с числами.
Здесь я работаю над адаптером RecyclerView, используя kotlin, я делюсь кодом для onBindViewHolder.
var stringBuilder: SpannableStringBuilder = SpannableStringBuilder()
override fun onBindViewHolder(holder: ViewHolder?, position: Int) {
// for 1 till 9
if (yourNo in 1..9) {
if (yourNo == 1)
changeSuperScripts(1, 3, yourNo + "st", holder.textView)
else if (contestStandingItem.rank == 2)
changeSuperScripts(1, 3, yourNo + "nd", holder.textView)
else if (contestStandingItem.rank == 3) {
changeSuperScripts(1, 3, yourNo + "rd", holder.textView)
} else
changeSuperScripts(1, 3, yourNo + "th", holder.textView)
}
// for 10 till 19
else if (yourNo in 10..19)
changeSuperScripts(2, 4, yourNo + "th", holder.textView)
// for 20 till 99
else if(yourNo in 20..99) {
if (yourNo % 10 == 0)
changeSuperScripts(2, 4, yourNo + "th", holder.textView)
else if (yourNo % 10 == 1)
changeSuperScripts(2, 4, yourNo + "st", holder.textView)
else if (yourNo % 10 == 2)
changeSuperScripts(2, 4, yourNo + "nd", holder.textView)
else if (yourNo % 10 == 3)
changeSuperScripts(2, 4, yourNo + "rd", holder.textView)
else
changeSuperScripts(2, 4, yourNo + "th", holder.textView)
}
// for 100 till 999
else if (yourNo in 100..999){
if (yourNo % 10 == 0)
changeSuperScripts(3, 5, yourNo + "th", holder.textView)
else if (yourNo % 10 == 1)
changeSuperScripts(3, 5, yourNo + "st", holder.textView)
else if (yourNo % 10 == 2)
changeSuperScripts(3, 5, yourNo + "nd", holder.textView)
else if (yourNo % 10 == 3)
changeSuperScripts(3, 5, yourNo + "rd", holder.textView)
else
changeSuperScripts(3, 5, yourNo + "th", holder.textView)
}
}
// start и end - это индексы, с которых начинается и заканчивается суперскрипт
fun changeSuperScripts(start: Int, end: Int, text: String, textView: TextView) {
stringBuilder.clear()
stringBuilder.append(text)
val formatter = OrdinalSuperscriptFormatter.getInstance(stringBuilder)
formatter.createSuperscriptSpan(start, end, textView)
}
// это отдельный класс, написанный на Java для преобразования текста в верхний индекс, я сделал его синглтоном для использования одного и того же объекта каждый раз (только для производительности)
открытый класс OrdinalSuperscriptFormatter {
public static OrdinalSuperscriptFormatter ordinalSuperscriptFormatter;
private static final String SUPERSCRIPT_REGEX = "(?<=\\b\\d{0,10})(st|nd|rd|th)(?=\\b)";
private static final Pattern PATTERN = Pattern.compile(SUPERSCRIPT_REGEX);
private static final float PROPORTION = 0.5f;
SuperscriptSpan superscript = new SuperscriptSpan();
RelativeSizeSpan size = new RelativeSizeSpan(PROPORTION);
private final SpannableStringBuilder stringBuilder;
public static OrdinalSuperscriptFormatter getInstance(SpannableStringBuilder stringBuilder){
if (ordinalSuperscriptFormatter == null) {
ordinalSuperscriptFormatter = new OrdinalSuperscriptFormatter(stringBuilder);
return ordinalSuperscriptFormatter;
}
else
return ordinalSuperscriptFormatter;
}
public static void refreshInstance(){
ordinalSuperscriptFormatter = null;
}
private OrdinalSuperscriptFormatter(@NonNull SpannableStringBuilder stringBuilder) {
this.stringBuilder = stringBuilder;
}
public void createSuperscriptSpan(int start, int end,TextView textView) {
stringBuilder.setSpan(superscript, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
stringBuilder.setSpan(size, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(stringBuilder);
}
}
// refreshInstance будет вызывать, когда вы снова начинаете свою деятельность, или fragmnet для обновления списка
override fun onResume() {
super.onResume()
OrdinalSuperscriptFormatter.refreshInstance() // must be referesh singleton instance for each history standings
}