2013-02-26 4 views
2

Здравствуйте, я искал форум часами и решил поставить вопрос, потому что я не могу найти что-то не так в моем коде. У меня есть ListView, за которым следует пользовательский адаптер. Каждый элемент в моем спискеView выглядит так: «txtView | | Btn 0 | Btn 1 | Btn 2 |» и я использую ViewHolder для повышения производительности. Я использую setOnClickListener из пользовательского адаптера. Каждая нажатая кнопка должна изменить ее фон на зеленый, а остальные на серый.Android-панель ListView ListView с несколькими проблемами кнопок с OnClickListener влияет на несколько элементов списка.

Моей проблемы в том, что при нажатии на определенную кнопку на определенном пункте строки также изменений фон на другую кнопку в другом ряду. Кажется, я не нашел свою проблему, я предполагаю, что это связано с тем, что я использую возможность повторного использования с помощью 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; 
     } 

    } 
+0

позиция в GetView позиция вашего элемента ListView. проверьте, есть ли позиция == 0, затем нажмите кнопку. – Raghunandan

ответ

0

В вашем GetView метод.

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

Вместо того, чтобы использовать, если условие можно использовать

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

Edit - Код ниже работал для меня.

    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); 
        } 


       } 

      }); 
+0

Привет, tnx для ответа. Я попытался использовать этот код, который ему не помог, но еще одна кнопка с одинаковой позицией окрашивается в зеленый цвет. просто чтобы напомнить, каждая строка собрана так: "| txtView | | btn0 | | btn1 | | btn2 |". position == 0 -> первая строка, которую я вижу, да? – Mikael

+0

Этот код работал для меня. Я протестировал его. Должен работать и в вашем случае. – Raghunandan

0

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

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

Попробуем найти лучшее решение для этого.

1

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

Я потащился 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); 

} 
});