2017-01-30 10 views
1

選択した項目の背景色を変更する方法が必要です。次のコードは、アイテムを2回目にクリックしたときにのみ背景色(青色)を変更します。だから、アイテムを最初にクリックすると、それは機能しません。ListView:バックグラウンドが最初に変更されないのはなぜですか?

final SongAdapter songAdt = new SongAdapter(getApplicationContext(), songList); 
lv.setAdapter(songAdt); 

lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      Log.i(TAG, " executed"); 
      view.setBackgroundColor(Color.BLUE); 
     } 
    } 
); 

私はコードが2回実行されるが、唯一の二度目は、背景が変更される(Log.i関数を使用して)チェックしています。どうして ?

+0

あなたが全体のコードを提供することにより、質問を手の込んだリストビューに? – OBX

+0

ほとんどの場合、ビューは再描画されません。完全なソースコードを持っていると、なぜこのようなことが起こるのか理解するのに役立ちます。 – jackgu1988

+0

上記の質問にいくつかのコードを追加しましたが、正確にはどの部分が必要ですか?ありがとう:) – xRobot

答えて

0

リストビューでは、android:listSelector = "@ color/sky"というプロパティがあり、これをxmlで使用します。これにより、選択した項目の背景が変更されます。

+0

私はあなたがここで見ることができるようにそれを試してみました:http://stackoverflow.com/questions/41936272/how-to-highlight-pressed-items-in-a-listview しかし、それは動作しないと私はしない理由を知っている。 – xRobot

+0

アンドロイド:choiceMode = "singleChoice"リストビューでこれを試してみましょう@xRobot –

+0

完了しましたが動作しません – xRobot

0

ライン

view.setBackgroundColor(Color.BLUE); 

を削除し、私はまだそれをテストしていない、この行を追加し、

parent.getChildAt(position).setBackgroundColor(getResources().getColor(R.color.list_blue_colour)); 

作業かどうかを確認し、作業している場合を共有してください、そして働いていない場合は、この答えover here

に従ってください
+0

getColorが廃止されたと言います – xRobot

+0

代わりにsetBackgroundColor(Color.BLUE);を使用してみてください – Redman

+0

この場合それは間違った項目を強調表示します – xRobot

1

これを試してください:

private int prevPosition=-1; 

とあなたのonItemClick使用:

lv.setOnItemClickListener(new OnItemClickListener() { 

    @Override 
    public void onItemClick(AdapterView<?> adapter, View view, 
      int position, long arg3) { 

     for (int i = 0; i < adapter.getChildCount(); i++) { 
      if (i == position) { 

       if(position!=prevPosition){ 
        //set your selected color      
        adapter.getChildAt(i).setBackgroundColor(Color.BLUE); 
        prevPosition=position; 

       }else{ 
        adapter.getChildAt(i).setBackgroundColor(Color.BLACK); 
        prevPosition=-1; 
        } 

       }else{ 
        //set your normal color 
        adapter.getChildAt(i).setBackgroundColor(Color.BLACK); 

       } 

      } 
    } 

}); 

オプション2

あなたlistview

res/drawableでフォルダの描画可能なセレクタを使用することができます

background.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="@drawable/pressed" /> 
<item android:state_focused="false" 
    android:drawable="@drawable/normal" /> 
</selector> 

pressed.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
<solid android:color="#000000"/> // set your selected color 
<padding android:left="5dp" 
     android:top="5dp" 
     android:right="5dp" 
     android:bottom="5dp"/> 
</shape> 

normal.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
<solid android:color="#FFFFFF"/>  

<padding android:left="5dp" 
     android:top="5dp" 
     android:right="5dp" 
     android:bottom="5dp"/> 
</shape> 

今、XMLであなたのlistviewでそれを使用します。

android:listSelector="@drawable/background" 
+0

これは音楽プレーヤーにとって効率的ではないかもしれません。それは大きな曲のリストで物事を遅くする。 – jackgu1988

+0

編集がうまくいくように見えて、これまでと同じようなことが私のために働いています。しかし、私はそれが動作しない場合、OPはこれがうまくいかないと言ったので、私はうまくいきません:http://stackoverflow.com/questions/41936272/how-to-highlight-pressed-items-in-a-listview – jackgu1988

+1

それは私はそれを試してみて、あなたの 'view.setBackgroundColor(Color.BLUE);を削除してくださいonItemClick – rafsanahmad007

関連する問題