1

アイテムのリストがあります。一部のアイテムは「表示済み」ステータスになる可能性があります。私はそれらのアイテムに他のアイテムとは異なる背景色を持たせたいです。

リストビューには基本的にリスト全体のセレクターが1つあり、アイテムの1つに背景色を設定すると、セレクターがアイテムのレイアウトの下に背景として描画され、透明であると見なされるため、うまくいきません。

リストに複数のセレクターを定義する方法はありますか?そうでない場合は、余分な状態を持つセレクターを作成することは可能ですか?基本的に必要なのは、通常のリストセレクターに加えて、ColorDrawableがcolors.xmlで定義されているという追加の状態です(ドローアブルから継承できず、Androidのlist_selectorドローアブルがSDKに表示されないためです。状態を追加したかったのですが、追加の状態を使用して強制するにはどうすればよいですか?)

4

2 に答える 2

3

答えを見つけました。私の問題はセレクターの状態ではありません。セレクターをすべてのアイテムで同じ状態にしたいのです! 問題は、アダプター内のアイテムの特定のブール値が false の場合はアイテムを規則的にし、ブール値が true の場合は X を色付けしたいのですが、色が X の場合でも、選択または押されたら透明にしたいということです。

したがって、解決策は次のxmlです。

    <?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" 
          android:drawable="@android:color/transparent" /> <!-- pressed -->
    <item android:state_selected="true" 
          android:drawable="@android:color/transparent" /> <!-- focused -->
    <item android:drawable="@color/viewed_hotels_color" /> <!-- default -->
</selector>

リスト自体が状態を取得するものであるにもかかわらず、それは状態をその子(つまりリスト項目)に渡しますが、そうではないと思っていました。android:focused のみがここでは有効ではありません。android リスト項目はフォーカスされていませんが、選択されています...押されていないか選択されていない状態でわかるように、デフォルトの色を指定します。それ以外の場合は透明で、セレクターはすべての人に表示されます.

私のアダプターでは、次のコードが必要です( getView() メソッド内):

View itemView = convertedView; <- i'll spare you the layout details...
Item item = getItem(position);
if( item.isViewed() ){
    itemView.setBackgroundResource(R.drawable.viewed_item_background);
}else{
    itemView.setBackgroundDrawable(null);
}

これにより、すべてのアイテムが適切な背景を取得するようになります。もちろん、アイテムの状態が閲覧済みに変更され、それを表示したい場合は、アダプターで notifyDatasetCahnged() を呼び出す必要があります。

于 2011-01-31T09:17:51.660 に答える
0

のカスタムサブクラスを実装しAdapter、メソッドをオーバーライドできますgetView()。このメソッドは単一のアイテムのを取得するViewためにリストによって呼び出されるため、をオーバーライドすることで単一のリストアイテムがどのように見えるかを定義できますgetView()。したがって、すでに表示されているアイテムの背景色を変更しても問題はありません。

アップデート

AbsListViewクラスが拡張するクラスListViewには、と呼ばれるメソッドがありsetDrawSelectorOnTop()ます。セレクターの動作を制御するために使用できると思います。

于 2011-01-13T14:13:53.317 に答える