【问题标题】:Android, ListView, ArrayAdapter and formatting textAndroid、ListView、ArrayAdapter 和格式化文本
【发布时间】:2012-09-10 14:18:03
【问题描述】:

我正在尝试完成以下任务:

  • 一个 ListView,带有 textview 行
  • 当我点击一个项目时,文本变为斜体

斜体的改变可以是别的东西——关键是要以某种方式改变文本。

我想使用 Html.fromHtml,因为在格式化文本时很容易处理。但是,我无法让它在我的设计中工作。

在我的主要活动中,我像这样创建和访问 ListView 和 ArrayAdapter:

lv = (ListView) this.findViewById(R.id.itemslist);

我有一个创建/更新适配器的方法,这样我就可以更新列表的内容:

private void displayList () {
   adapter = new ItemArrayAdapter(getApplicationContext(), R.layout.item_listitem, items);
    lv.setAdapter(adapter);
    adapter.setNotifyOnChange(true);

}

我的 OnItemClickListener:

lv.setOnItemClickListener(new OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    Toast.makeText(ShoppingListApp02Activity.this, "List item selected:" + 
        items.get(position).getId(), Toast.LENGTH_LONG).show();
    items.get(position).setName("<i>" + items.get(position).getName() + "</i>");
    displayList();
});

如您所见,在选择/单击一个项目时,我将由 html 标记包围的项目名称发送到 Item 类的 setName() 方法。项目对象的名称(字符串类型)现在是“name

Item 类中的 setName() 方法:

public void setName (String nname) { this.name = nname; }

现在,在 ArrayAdapter 类 (ItemArrayAdaper.java) 中,名称设置在 ListView 的 TextView 行中:

itemName.setText(item.name);

如果我保持上面的代码不变,当单击列表中的项目时,名称会更改为:“name

到目前为止,和我预期的一样。

但是,从那里我需要将字符串“name”转换为 html 结果,即“name”。但是当我这样尝试时:

itemName.setText(Html.fromHtml(item.name).toString());

它只是跳过html标签并正常显示名称字符串。

为什么 fromHtml 在这里不起作用?

为了比较,我尝试以相同的方式在我的应用程序(页脚)中设置另一个 TextView 的内容,只是:

footerview.setText(Html.fromHtml("<i><font color='#123456'>text</font></i>"));

而且效果很好。但是在路径的某个地方,项目名称周围的标签丢失了。这很奇怪,因为在 ItemArrayAdapter 类中,当我不尝试从 html 转换时,标签就在那里。当在同一个地方使用 fromHtml 方法时,它们只是不被尊重。

有什么想法吗?

而且,我知道可能有更好的方法来做到这一点,我也会对此感兴趣:-)

【问题讨论】:

  • 您是否尝试在此处删除toString() itemName.setText(Html.fromHtml(item.name).toString());
  • 好吧,也许你可以在itemName.setText(...) 行之前添加一些Log.i("debug","item.name="+item.name),然后向我们展示结果...
  • 是否需要使用 html 标签 使其变为斜体?你可以像这样developer.android.com/reference/android/widget/…

标签: android android-listview android-arrayadapter


【解决方案1】:

换一种方法怎么样?

正如你所说的

我正在尝试完成以下任务:

  • 一个 ListView,带有 textview 行。

  • 当我点击一个项目时,文本变为斜体

简单地说,初始化:

lv = (ListView) this.findViewById(R.id.itemslist);
private void displayList () {
   adapter = new ItemArrayAdapter(getApplicationContext(), R.layout.item_listitem, items);
    lv.setAdapter(adapter);
    adapter.setNotifyOnChange(true);

}

在你的 onItemClickListener() 中

lv.setOnItemClickListener(new OnItemClickListener() {
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    Toast.makeText(ShoppingListApp02Activity.this, "List item selected:" + 
        items.get(position).getId(), Toast.LENGTH_LONG).show();

        ((TextView)view).setTypeface(null, Typeface.ITALIC);


});

够简单吗?

【讨论】:

  • 我喜欢那个解决方案,但我不确定它在这个例子中是如何工作的。我在 Item 对象中设置字符串,然后 ArrayAdapter 类将它放在 TextView 中。因此,由于我在将字符串放入 TextVeiw 之前存储了字符串,因此将格式嵌入到字符串中似乎更容易。还是我错过了一种更简单的方法?
  • 是的,我明白了。更优雅,我会说。但是,您的示例因 ClassCastException 而崩溃。
  • 我假设R.layout.item_listitem 是一个TextView。如果是,你做错误处理,我只能分享这个想法:-)
  • 意识到我参加聚会有点晚了,但我刚试了一下,效果很好。只需要弄清楚如何将斜体更改为删除线,一切都很好。谢谢,
【解决方案2】:

简单的解决方案:删除 toString()。我没有尝试过,因为我之前遇到过问题,认为传递给 TextView 的数据必须是纯字符串。但是,它就像没有 toString() 的魅力 :-)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多