2013-05-29 49 views
0

我正在開發一個帶有照片的列表視圖,並且在這張照片下面我有1個普通按鈕和1個切換按鈕。 我希望這個切換按鈕的行爲就像一個Like按鈕 - 如果我點擊一個按鈕,我會增加當前照片的喜歡數量,如果再次按下按鈕,我會減少喜歡的按鈕數量。ListView中的ToggleButton奇怪的行爲

這裏的代碼如下:

private View.OnClickListener likeBtnClickListener = new View.OnClickListener() 
    { 
     @Override 
     public void onClick(View view) 
     { 
      if(likeBtn.isChecked()) 
      { 
       likeBtn.setBackgroundDrawable(getContext().getResources().getDrawable(R.drawable.heart)); 
       likeBtn.setChecked(false); 
       if(Integer.parseInt(likeBtn.getTextOff().toString())>0) 
       { 
        likeBtn.setTextOff(String.valueOf(Integer.parseInt(likeBtn.getTextOn().toString())-1)); 
       } 
       Log.e(String.valueOf(view.getTag()), "isChecked"); 
      } 
      else 
      { 
       likeBtn.setBackgroundDrawable(getContext().getResources().getDrawable(R.drawable.heart_on)); 
       likeBtn.setChecked(true); 
       likeBtn.setTextOn(String.valueOf(Integer.parseInt(likeBtn.getTextOff().toString())+1)); 
       Log.e(String.valueOf(view.getTag()), "!!isChecked"); 
      } 
     } 
    }; 

下面是從我的適配器getView方法:

public View getView(int position, View convertView, ViewGroup parent) 
    { 
     View view = convertView; 

     if(view == null) 
     { 
      LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      view = inflater.inflate(R.layout.photo_view_cell, null); 
     } 

     Photo dData = data.get(position); 
     if(dData!=null) 
     { 
      ImageView profileImg = (ImageView) view.findViewById(R.id.profile_img); 
      TextView username = (TextView) view.findViewById(R.id.name); 
      ImageView photoImage = (ImageView) view.findViewById(R.id.image); 
      TextView date = (TextView) view.findViewById(R.id.date); 
      likeBtn = (ToggleButton) view.findViewById(R.id.likesBtn); 
      ToggleButton commentBtn = (ToggleButton) view.findViewById(R.id.commentsBtn); 

      int noLikes = dData.getNoLikes(); 
      if(noLikes>0) 
      { 
       likeBtn.setChecked(true); 
       likeBtn.setBackgroundDrawable(getContext().getResources().getDrawable(R.drawable.heart_on)); 
       likeBtn.setTextOn(String.valueOf(noLikes)); 
       likeBtn.setTextOff(String.valueOf(noLikes)); 
      } 
      else 
      { 
       likeBtn.setChecked(false); 
       likeBtn.setBackgroundDrawable(getContext().getResources().getDrawable(R.drawable.heart)); 
       likeBtn.setTextOff("0"); 
       likeBtn.setTextOn("0"); 

      } 
      likeBtn.setOnClickListener(likeBtnClickListener); 
      username.setText(dData.getUser().getUsername()); 
      photoImage.setImageBitmap(dData.getImage()); 
      date.setText(dData.getDate()); 
     } 

     view.setTag(position); 
     return view; 
    } 

現在的問題是,這種切換按鈕,不因爲他們應該工作。例如,現在,我在主列表視圖中顯示了3張照片 - 每張照片下方有1個切換按鈕和一個正常按鈕。當我點擊第二個按鈕下方的切換按鈕時 - 第一個照片下方的切換按鈕激活 - 如果我點擊下面的切換按鈕或有時不切換此切換按鈕。

你能告訴我我做錯了什麼嗎?

謝謝!

回答

1

它看起來像你有likeBtn設置爲一個全局變量,這是在getView()onClickListener()都操縱。這意味着,隨着列表的每一行都被創建,您將失去對前一個按鈕的引用,而轉而使用新按鈕。當任何按鈕被點擊並且偵聽器被觸發時,您的邏輯將僅發生在用getView()創建的最後一行,而不一定是被點擊的行。

要解決此問題,可以使用View參數與onClick()方法將參考的範圍本地化爲likeBtn。該參數將始終是被點擊的View,在這種情況下,您的ToggleButton。在你getView(),而是採用了全球likeBtn,此行更改:​​

likeBtn = (ToggleButton) view.findViewById(R.id.likesBtn); 

到一個創建一個局部變量:

ToggleButton likeBtn = (ToggleButton) view.findViewById(R.id.likesBtn); 

然後,在你onClick(),創建另一個局部變量類型轉換參數:

@Override 
public void onClick(View view) 
{ 
    ToggleButton likeBtn = (ToggleButton) view; 

    //Then the rest of your code 
}