Android TextView中的有序列表

Yoa*_*ein 13 android list textview

我想在TextView中显示有序列表,例如:
1)项目1
2)项目2

使用以下布局:

<TextView
    android:text="<ol><li>item 1\n</li><li>item 2\n</li></ol>
    />
Run Code Online (Sandbox Code Playgroud)

我明白了:

  • 第1项
  • 第2项

如何将项目符号更改为数字?

谢谢.

Håv*_*ard 10

我认为你必须在代码中这样做.我不得不将LeadingMarginSpan子类化以使其工作.我就是这样做的.

private class NumberIndentSpan implements LeadingMarginSpan {

    private final int gapWidth;
    private final int leadWidth;
    private final int index;

    public NumberIndentSpan(int leadGap, int gapWidth, int index) {
        this.leadWidth = leadGap;
        this.gapWidth = gapWidth;
        this.index = index;
    }

    public int getLeadingMargin(boolean first) {
        return leadWidth + gapWidth;
    }

    public void drawLeadingMargin(Canvas c, Paint p, int x, int dir, int top, int baseline, int bottom, CharSequence text, int start, int end, boolean first, Layout l) {
        if (first) {
            Paint.Style orgStyle = p.getStyle();
            p.setStyle(Paint.Style.FILL);
            float width = p.measureText("4.");
            c.drawText(index + ".", (leadWidth + x - width / 2) * dir, bottom - p.descent(), p);
            p.setStyle(orgStyle);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

抓住你的观点,并像这样使用它:

SpannableStringBuilder ssb = new SpannableStringBuilder();
for(String text : list) {
    int contentStart = content.length();
    content.append(text);
    content.setSpan(new NumberIndentSpan(15, 15, number), contentStart, content.length(), 0);
}

TextView view = findViewById(R.id.....);
view.setText(ssb);
Run Code Online (Sandbox Code Playgroud)

希望这有助于其他人寻找这个:-)


Pra*_*V R 6

  1. 转到 res/values/strings.xml 然后粘贴以下代码

    <string name="list">
      <li>1) Item 1</li>\n
      <li>2) Item 2</li>\n
      <li>3) Item 3</li>\n
    </string>
    
    Run Code Online (Sandbox Code Playgroud)
  2. 然后转到包含 TextView 的布局文件并替换为以下代码

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/list" />
    
    Run Code Online (Sandbox Code Playgroud)

  • 这种方法在每个项目的数字之前添加了一个项目符号 (2认同)

Aka*_*EMU 5

我按照@jk2K 的回答 并修改了他的代码。由于我需要对每个要点进行缩进,

String[] textArray = {
    "dfsdljjlfsdsdfjsdjldssdfidfsjdljasdfjfds\n",
    "sdfjdfjlkfdjdfkfjiwejojodljfldsjodsjfsdjdlf\n",
    "djsdfjsdffjdflljfjsadfdjfldfjl"
};

SpannableStringBuilder content = new SpannableStringBuilder();
int number = 1;
for (String t1 : textArray) {
    int contentStart = content.length();

    content.append(t1);

    int contentEnd = content.length();
    content.setSpan(
            new BulletSpan(10),
            contentStart,
            contentEnd,
            Spannable.SPAN_INCLUSIVE_EXCLUSIVE
    );

    number++;
}
Run Code Online (Sandbox Code Playgroud)

我使用了android 库中的 BulletSpan 类,并将其替换new LeadingMarginSpan.Standard(0, 66)new BulletSpan(10)创建宽度为 BulletSpan 的类。正如BulletSpan 类文档中提到的

BulletSpan(int gapWidth)

Creates a BulletSpan based on a gap width 
Run Code Online (Sandbox Code Playgroud)

因此,您不再需要附加@jk2K 答案中提到的项目符号,

 String leadingString = number + ". ";
 content.append(leadingString);
Run Code Online (Sandbox Code Playgroud)


小智 1

您可以改用这种方式:

&#8226; foo<br/>
&#8226; bar<br/>
&#8226; baz<br/>
Run Code Online (Sandbox Code Playgroud)

  • 获得项目符号而不是数字:( (2认同)