2013-02-26 55 views
2

你好我搜索了几个小时现在论坛,并决定放置一个问题,因为我真的找不到我的代码中有什么问题。我有一个ListView后跟一个自定义适配器。 我的listView中的每个项目看起来像这样“| txtView | | Btn 0 | | Btn 1 | | Btn 2 |”我使用ViewHolder来提高性能。我使用自定义适配器中的setOnClickListener。 每个按钮点击应该改变它的背景为绿色和其他灰色。Android 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

位置是你的ListView项的位置。检查位置== 0,然后单击按钮。 – Raghunandan 2013-02-26 15:31:50

回答

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

编辑的 - 下面的代码为我工作。

    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 |”。位置== 0 - >我看到的第一行是? – Mikael 2013-02-26 15:48:20

+0

上面的代码适用于我。我已经测试过它。也应该在你的情况下工作。 – Raghunandan 2013-02-28 13:03:01

0

嘿,我刚刚遇到过类似问题,一旦当我工作的一个项目,这是一个紧急情况,然后,我发现这有些不太好解决。

我所做的只是在您的getView()方法的if条件中为findViewbyId提供了文本视图或按钮的独特内容描述,然后检查了onclick()覆盖方法的条件。

将试图找到一个更好的解决方案。

1

我已经通过下面的解决了这个问题:

button标记holder

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

我已通过以下背景色:在getview

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

} 
}); 
相关问题