こんにちは、フォーラムを何時間も検索しましたが、自分のコードで何が問題なのかが本当にわからないので、質問をすることにしました。ListView の後にカスタム アダプターが続きます。listView の各項目は、「|txtView| |Btn 0| |Btn 1| |Btn 2|」のようになります。パフォーマンスを向上させるために ViewHolder を使用しています。カスタム アダプタの setOnClickListener を使用します。クリックされた各ボタンは、背景を緑色に、その他のボタンを灰色に変更する必要があります。
私の問題は、特定の行項目で特定のボタンをクリックすると、別の行の別のボタンの背景も変更されることです。問題が見つからないようです。ViewHolder で再利用機能を使用しているという事実に関連していると思います。
皆さんが助けてくれることを願っています、どうもありがとう。
これはアダプター内の私の getView です
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.bet_list_item, null);
holder = new ViewHolder();
holder.tvGameDescription = (TextView) convertView
.findViewById(R.id.gameDescription);
holder.button0 = (Button) convertView
.findViewById(R.id.button0);
holder.button1 = (Button) convertView
.findViewById(R.id.button1);
holder.button2 = (Button) convertView
.findViewById(R.id.button2);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
MyOnclickListener myOnclickListener = new MyOnclickListener(holder);
holder.buttonSide1.setOnClickListener(myOnclickListener);
holder.buttonSideX.setOnClickListener(myOnclickListener);
holder.buttonSide2.setOnClickListener(myOnclickListener);
これはリスナーの実装です:
private class MyOnclickListener implements OnClickListener {
private ViewHolder viewHolder;
boolean[] buttonsClickStatus = { false, false, false }; //all gray at start and not clicked
public MyOnclickListener(ViewHolder viewHolder) {
this.viewHolder = viewHolder;
}
@Override
public void onClick(View v) {
switch (((Data) v.getTag()).getBtnPosition()) {
case Consts.BUTTON_0:
if (!buttonsClickStatus[0]) { // case the btn is gray unclicked
setButtonsaBackground(0); // changes the background
buttonsClickStatus[0] = true;
buttonsClickStatus[1] = false;
buttonsClickStatus[2] = false;
} else { // case already green clicked already
addOrRemove = false;
setButtonsaBackground(3);
for (int i = 0; i < buttonsClickStatus.length; i++) {
buttonsClickStatus[i] = false;
}
}
break;
case Consts.BUTTON_1:
if (!buttonsClickStatus[1]) { // case gray
setButtonsaBackground(1);
buttonsClickStatus[1] = true;
buttonsClickStatus[0] = false;
buttonsClickStatus[2] = false;
} else { // case already green
addOrRemove = false;
setButtonsaBackground(3);
for (int i = 0; i < buttonsClickStatus.length; i++) {
buttonsClickStatus[i] = false;
}
}
break;
case Consts.BUTTON_2:
if (!buttonsClickStatus[2]) { // case gray
setButtonsaBackground(2);
buttonsClickStatus[2] = true;
buttonsClickStatus[0] = false;
buttonsClickStatus[1] = false;
} else { // case already green
addOrRemove = false;
setButtonsaBackground(3);
for (int i = 0; i < buttonsClickStatus.length; i++) {
buttonsClickStatus[i] = false;
}
}
break;
default:
break;
}
//call a function to update data only in the activity
myActivity.update((Data) v.getTag());
}
SetBackground は、プライベート メソッドとしてリスナー内にあります。
private void setButtonsaBackground(int clicked) {
switch (clicked) {
case 0:
viewHolder.button0.setBackgroundColor(Color.GREEN);
viewHolder.button1.setBackgroundColor(Color.GRAY);
viewHolder.button2.setBackgroundColor(Color.GRAY);
break;
case 1:
viewHolder.button1.setBackgroundColor(Color.GREEN);
viewHolder.button0.setBackgroundColor(Color.GRAY);
viewHolder.button2.setBackgroundColor(Color.GRAY);
break;
case 2:
viewHolder.button2.setBackgroundColor(Color.GREEN);
viewHolder.button0.setBackgroundColor(Color.GRAY);
viewHolder.button1.setBackgroundColor(Color.GRAY);
break;
case 3:
viewHolder.button2.setBackgroundColor(Color.GRAY);
viewHolder.button0.setBackgroundColor(Color.GRAY);
viewHolder.button1.setBackgroundColor(Color.GRAY);
break;
default:
break;
}
}