次のタスクを達成しようとしています。
- テキストビュー行を含む ListView
- アイテムをクリックすると、テキストが斜体に変わります
斜体への変更は別の方法で行うことができます。ポイントは、テキストを何らかの方法で変更することです。
テキストをフォーマットするときに扱いやすいので、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() メソッドに送信されます。アイテム オブジェクトの名前 (文字列型) は "<i>name</i>" になりました
Item クラスの setName() メソッド:
public void setName (String nname) { this.name = nname; }
これで、ArrayAdapter クラス (ItemArrayAdaper.java) で、ListView の TextView 行に名前が設定されます。
itemName.setText(item.name);
上記のコードをそのままにしておくと、リスト内の項目をクリックすると、名前が次のように変わります: "<i>name</i>.
ここまでは、思った通りです。
ただし、そこから文字列「<i>name</i>」を html の結果、つまり「name」に変換する必要があります。
itemName.setText(Html.fromHtml(item.name).toString());
html タグをスキップして、名前の文字列を通常どおりに表示するだけです。
ここで fromHtml が機能しないのはなぜですか?
比較するために、アプリケーション (フッター) で別の TextView の内容を同じように設定してみました。
footerview.setText(Html.fromHtml("<i><font color='#123456'>text</font></i>"));
そして、それはうまくいきました。しかし、パスのどこかで、アイテム名を囲むタグが失われています。これは奇妙です。なぜなら、html から変換しようとしないときの ItemArrayAdapter クラスには、タグが存在するからです。同じ場所で fromHtml メソッドを使用すると、それらは受け入れられません。
何か案は?
そして、おそらくこれを行うためのより良い方法があることを知っており、それにも興味があります:-)