0

カスタム アダプターに次のコード行があります。

int colorPos = position % colours.length;
vi.setBackgroundColor(colours[colorPos]);

coloursは次のように定義されます。

private int[] colours = new int[] { R.drawable.row_colour, R.drawable.row_colour2 };

これを使用して、ユーザーが行の 1 つをクリックすると、背景色が変わります。各行に交互の色があるため、2 つR.drawable.row_colourの s があります。最初の色はグレーのはずですが、すべての行が黒です。そして、各行をクリックすると、この茶色になります。ここに私のrow_colourとrow_colour2コードがあります:

行の色

<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:state_focused="true" android:state_pressed="false" android:color="#ABCC2A" />
  <item android:state_focused="true" android:state_pressed="true" android:color="#ABCC2A" />
  <item android:state_focused="false" android:state_pressed="true" android:color="#ABCC2A" />
  <item android:color="#424242" />
</selector>

row_color2

<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:state_focused="true" android:state_pressed="false" android:color="#ABCC2A" />
  <item android:state_focused="true" android:state_pressed="true" android:color="#ABCC2A" />
  <item android:state_focused="false" android:state_pressed="true" android:color="#ABCC2A" />
  <item android:color="#1B1B1B" />
</selector>

背景の色を変更する必要がありますが、このコードでは機能しません。#424242行が と の間で交互に表示される必要があります。#1B1B1Bクリックすると に移動し#ABCC2Aます。事前に情報を提供していただきありがとうございます

4

2 に答える 2

0

ユーザーがアイテムを押したときに一瞬だけ色を変えたいと仮定すると、次のように state_focused 要素を削除するだけです:

<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:state_pressed="true" android:color="#ABCC2A" />
  <item android:color="#424242" />
</selector>

ただし、色を変更したままにしたい場合は、アダプターまたはリストを拡張して、選択されている項目を保存するか、各項目のルート レイアウトを拡張して、選択されているかどうかを保存する必要があります。次に、カスタム アダプターで、ビューを提供するときに、この情報を照会し、背景色を適切に変更します。全体として、おそらく単純であるべき何かを達成するための厄介で複雑な方法です。アイテムの拡張ルート レイアウトに Checkable インターフェイスを実装する別の方法があると聞いたことがありますが、個人的にはこれで成功したことはありません。

于 2012-08-17T15:09:47.330 に答える
0

アダプターのメソッド getView からプログラムで色を変更する場合は、アダプターの状態を更新する必要があります... set メソッドなどを使用して...そして、 ListView にその状態を強制的に再描画させる関数を呼び出します。アダプタで getView を呼び出して、リスト項目を再構築します。ListView.invalidate() を試してみましたが、動作しますが、 BaseAdapter.notifyDataSetChanged() も動作するはずです。

于 2012-08-18T06:57:02.643 に答える