2

こんにちは、フォーラムを何時間も検索しましたが、自分のコードで何が問題なのかが本当にわからないので、質問をすることにしました。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;
        }

    }
4

3 に答える 3

0

ねえ、私はプロジェクトに取り組んでいたときに一度同様の問題を抱えていました。それは緊急事態であり、これに対するあまり良くない解決策を見つけました。

getView() メソッドの if 条件で findViewbyId を使用しているときに、テキスト ビューまたはボタンに一意のコンテンツの説明を与え、onclick() メソッドがオーバーライドされているかどうかを確認するだけです。

これに対するより良い解決策を見つけようとします。

于 2013-02-26T16:10:41.010 に答える
0

getview メソッドで。

 if(posiiton==0)
 {
   holder.buttonSide1.setOnClickListener(myOnclickListener);
 }

if 条件を使用する代わりに、使用できます

 for(int i=0;i<yourlisitemcount;i++)
 {
 if(position==i)    //make sure you click the button in appropriate listview position
  {
    holder.buttonSide1.setOnClickListener(myOnclickListener);
  }
 }

編集 - 以下のコードは私にとってはうまくいきました。

                    vh.b1=(Button)arg1.findViewById(R.id.b1);//button 1
            vh.b2=(Button)arg1.findViewById(R.id.b2);// button2

            vh.b1.setOnClickListener(new OnClickListener()
            {

                public void onClick(View v) {
                    if(position==1)
                    {
                        vh.b1.setBackgroundColor(Color.RED);
                        vh.b2.setBackgroundColor(Color.GREEN);
                    }


                }

            });
于 2013-02-26T15:39:18.420 に答える