2

onListItemClickイベントを使用して、選択したアイテムの背景色を変更するListViewがあります。

@Override
public void onListItemClick(final ListView l, final View v, final int position, final long id)
{
    v.setBackgroundColor(Color.GRAY);
}

単一のビューの背景色を変更する前に、ListViewのすべての行を元の色にリセットすることは可能ですか?問題は、選択した各アイテムが背景色を保持し、ユーザーがクリックした最新のアイテムのみを変更したいということです。

アップデート:

JRaymondの応答が最善のアプローチのようですが、Androidレイアウトで作業する場合は通常、コードを挿入しても何も起こりません。それをデバッグする方法も、エラーメッセージも、何もありません。私はAndroidレイアウトを扱うのが絶対に嫌いです。それは、UIを扱うための最も複雑で、ひどく実装されたデザインです。

とにかく、これは私がこれまでに持っているものです:

リストビュー:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="wrap_content"  
    android:layout_height="fill_parent" 
    > 

        <ListView android:id="@android:id/list"
            android:layout_width="wrap_content"  
            android:layout_height="fill_parent" 
            android:choiceMode="singleChoice"
            android:listSelector="@drawable/listing_selector"           
        />

        <TextView android:id="@android:id/empty"
            android:layout_width="wrap_content"  
            android:layout_height="fill_parent" 
            android:padding="5dp"
        />

</LinearLayout>

Listing_selector.xml

<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android" >

   <item android:state_focused="true" android:drawable="@android:color/transparent" />
   
   <item android:state_pressed="true" android:drawable="@android:color/transparent" />

   <item android:state_selected="true" android:state_activated="true" android:drawable="@android:color/black" />
   
   <item android:state_activated="true" android:drawable="@android:color/transparent" />    
   
   <item android:state_selected="true" android:drawable="@android:color/transparent" />
   
   <item android:drawable="@android:color/transparent" />
   
</selector>

私が言ったように、アイテムをクリックしても何も起こりません。組み込みのハイライトも消えています。すべての色を黒に変えてみましたが、何も起こりません。

UPDATE2:

近づいています。この記事を読んだ後、 selectorxmlをcolor下という名前のフォルダーに配置する必要があります。次に、それ自体ではなく、内の各アイテムのレイアウトの背景としてresを設定します。selectorListViewListView

<?xml version="1.0" encoding="UTF-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"  
    android:layout_height="fill_parent" 
    android:orientation="horizontal"
    android:background="@color/listing_selector"    
>
    <TextView 
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
    />
    
</RelativeLayout>

各アイテムをタッチすると背景色が点滅しますListViewが、元の背景色に戻らないままです。これは私が使用しているセレクターです:

<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item  android:state_selected="false" android:state_pressed="false" android:drawable="@android:color/transparent" />
    
    <item android:state_pressed="true" android:drawable="@color/blue" />
    
    <item android:state_selected="true" android:state_pressed="false" android:drawable="@color/blue" />

</selector>

color.xml:

<?xml version="1.0" encoding="UTF-8"?>

<resources>    
    <color name="blue">#ff33b5e5</color>        
</resources>

これはお尻の絶対的な痛みです。UIを処理するためのこのひどいシステムを思いついた人は誰でも解雇されるべきです。

解決:

100%確実ではありませんが、これはAndroid3.0以降のデバイスでのみ機能する可能性があります。state_activated背景色を設定するものです。

4

2 に答える 2

1

探しているのは、stateListDrawable(セレクターとも呼ばれます)とchoiceModeの組み合わせです。

このようなxmlをフォルダーに含めますdrawables(背景として他のドローアブルを使用していますが、色も同様に機能します):

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
        <item android:state_focused="true"
          android:drawable="@drawable/list_item_pressed" />
    <item android:state_pressed="true"
          android:drawable="@drawable/list_item_pressed" />
    <item android:state_selected="true"
          android:state_activated="true"
          android:drawable="@drawable/list_item_selected" />
    <item android:state_activated="true"
          android:drawable="@drawable/list_item_selected" />
    <item android:state_selected="true"
          android:drawable="@android:color/black" />
    <item android:drawable="@android:color/transparent" />
</selector>

choiceMode次に、リストビューをに設定しますsingleChoice

<ListView
  ...
  android:choiceMode="singleChoice"

これにより、OSがバックグラウンドを処理できるようになります。

于 2012-04-13T23:51:06.630 に答える
0

単純な解決策は、onitemclickで、アイテムのクリックされた位置を覚えて、notifydatachanged()を呼び出し、retrunステートメントの直前にカスタムアダプタのgetView()で、以下のように比較するifループです:::

if(postion == itemclickedposition)
    converterView.setBackgroundColor(Color.GRAY);
于 2012-04-14T02:29:43.427 に答える