2016-07-06 203 views
1

這是我的代碼。什麼可以成爲一個原因?Android setOnCheckedChangeListener運行兩次

holder.favorite.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      if (isChecked) { 
       addFavorite(famous); 
      } else { 
       deleteFavorite(famous); 
      } 
     } 
    }); 

isChecked=true,首先運行addFavorite()deleteFavorite()後。

isChecked=false時,首先運行deleteFavorite()然後addFavorite()

不知道爲什麼......

編輯:當我向下滾動/我的ListView它調用這些方法太...怪異......

private void deleteFavorite(final FamousTop40Ranking famous) { 
     DeleteFavoriteData data = new DeleteFavoriteData(famous.getId()); 
     FavoriteDeleteApi.Factory.getInstance().deleteFavorite(data.getData()) 
       .enqueue(new Callback<StatusInfoModel>() { 
        @Override 
        public void onResponse(Call<StatusInfoModel> call, Response<StatusInfoModel> response) { 
         showToast(mActivity, "Famous deleted from your Favorites list."); 
         famous.setFollowersCountry(famous.getFollowersCountry() - 1); 
         famous.setFollowersWorld(famous.getFollowersWorld() - 1); 
         notifyDataSetChanged(); 
        } 

        @Override 
        public void onFailure(Call<StatusInfoModel> call, Throwable t) { 
         Log.d("deleteFavorite", mActivity.getString(R.string.something_went_wrong) + t.getMessage()); 
        } 
       }); 
    } 




private void addFavorite(final FamousTop40Ranking famous) { 
     FavoriteCountApi.Factory.getInstance().countFavorites() 
       .enqueue(new Callback<CountFavoriteModel>() { 
        @Override 
        public void onResponse(Call<CountFavoriteModel> call, Response<CountFavoriteModel> response) { 
         if (response.isSuccessful()) { 
          if (response.body().getCount() < 20) { 
           FavoriteAddApi.Factory.getInstance().addFavorite(String.valueOf(famous.getId())) 
             .enqueue(new Callback<StatusInfoModel>() { 
              @Override 
              public void onResponse(Call<StatusInfoModel> call, Response<StatusInfoModel> response) { 
               showToast(mActivity, "Famous added from your Favorites list."); 
               famous.setFollowersCountry(famous.getFollowersCountry() + 1); 
               famous.setFollowersWorld(famous.getFollowersWorld() + 1); 
               notifyDataSetChanged(); 
              } 

              @Override 
              public void onFailure(Call<StatusInfoModel> call, Throwable t) { 
               Log.d("addFavorite", mActivity.getString(R.string.something_went_wrong) + t.getMessage()); 
              } 
             }); 
          } else { 
           showToast(mActivity, mActivity.getString(R.string.reached_max_favorites)); 
          } 
         } 
        } 

        @Override 
        public void onFailure(Call<CountFavoriteModel> call, Throwable t) { 
         Log.d("countFavorite", mActivity.getString(R.string.something_went_wrong) + t.getMessage()); 
        } 
       }); 
    } 

getView()方法:

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    final ViewHolder holder; 

    if(convertView == null) { 
     LayoutInflater inflater = (LayoutInflater) mActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = inflater.inflate(R.layout.list_view_ranking_famous_single_item, parent, false); 
    } 

    final FamousTop40Ranking famous = famousModelList.get(position); 

    holder = new ViewHolder(convertView); 

    holder.name.setText(famous.getName()); 
    if (mTab == 0) { // RankingFamousMainFragment.TAB_FAMOUS 
     holder.followers.setText(String.valueOf(famous.getFollowersWorld())); 
    } else { 
     holder.followers.setText(String.valueOf(famous.getFollowersCountry())); 
    } 

    if (famous.getIsFavorite().get(0).getFavorite().equals("1")) { 
     holder.favorite.setChecked(true); 
    } else { 
     holder.favorite.setChecked(false); 
    } 

    Glide 
      .with(mActivity) 
      .load(famous.getPhoto()) 
      .fallback(R.drawable.bg_gradient) 
      .error(R.drawable.bg_gradient) 
      .centerCrop() 
      .crossFade() 
      .into(holder.photo); 

    holder.favorite.setOnCheckedChangeListener(null); 
    holder.favorite.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      if (isChecked) { 
       addFavorite(famous); 
      } else { 
       deleteFavorite(famous); 
      } 
     } 
    }); 

    convertView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      showToast(mActivity, mActivity.getString(R.string.famous_clicked, position)); 
     } 
    }); 

    return convertView; 
} 

回答

1

在getView中。在if/else之前移動setonCHecked(null)。

這是hapening的原因是getView可能會被調用很多次,在這種情況下,我認爲它被調用是因爲當你改變狀態(選中/取消選中)時,它會重新繪製按鈕。而在你的getView中,你正在調用setChecked來觸發監聽器。在調用holder.favorite.setChecked(true/false)之前,將偵聽器設置爲null將不會觸發它。

關於上/下問題 - 它是相同的,當視圖是屏幕它被刪除。當它再次出現時,它會調用getView whichi觸發所有內容,原因是holder.favorite.setChecked(true)激活onCheckChangedLIstener