Пользовательская строка Android ListView с несколькими проблемами с кнопками OnClickListener влияет на несколько элементов списка

Здравствуйте, я искал форум в течение нескольких часов и решил задать вопрос, потому что я не могу найти, что не так в моем коде. У меня есть 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;
        }

    }

person Mikael    schedule 26.02.2013    source источник
comment
position в getview — это позиция вашего элемента listview. проверьте, если position==0, затем нажмите кнопку .   -  person Raghunandan    schedule 26.02.2013


Ответы (3)


Я решил проблему следующим образом:

Я отметил holder в button.

 holder.btnSetLock.setTag(holder);
 holder.btnUnLock.setTag(holder);

Я установил цвет фона следующим образом:

holder.btnUnLock.setOnClickListener(new OnClickListener() {

  @Override
  public void onClick(View v) {
 // TODO Auto-generated method stub
 // Button btn = Button(v);
   holder = (ViewHolder) v.getTag();
   holder.btnSetLock.setBackgroundResource(R.drawable.btn_lock_bg_right);
holder.btnUnLock.setBackgroundResource(R.drawable.btn_unlock_bg_left);

}
});
person Hafizur Rahman    schedule 15.04.2013

Эй, у меня была похожая проблема однажды, когда я работал над проектом, тогда это была чрезвычайная ситуация, и я нашел не очень хорошее решение для этого.

Все, что я сделал, это дал уникальное описание содержимого для текстового представления или кнопок в вашем случае, в то время как findViewbyId в условии if вашего метода getView(), а затем проверил условие, если метод onclick() переопределен.

Постараюсь найти лучшее решение для этого.

person Droidee    schedule 26.02.2013

В вашем методе 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);
                    }


                }

            });
person Raghunandan    schedule 26.02.2013
comment
Привет, спасибо за ответ. Я пытался использовать этот код, это не помогло, еще одна кнопка с той же позицией была окрашена в зеленый цвет. напомню, что каждая строка собирается вот так |txtView| |бтн0| |бтн1| |бтн2|. position == 0 -> первая строка, которую я вижу да? - person Mikael; 26.02.2013
comment
Приведенный выше код работал для меня. Я проверил это. Должно работать и в вашем случае. - person Raghunandan; 28.02.2013