2016-07-06 2 views
1

이것은 내 코드입니다. 바는 무엇을 할 수 있습니까? 첫째로 실행 isChecked=trueaddFavorite()deleteFavorite()Android setOnCheckedChangeListener가 두 번 실행됩니다.

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

.

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)을 이동하십시오.

getView는 많은 경우 호출되는 getView 일 수 있습니다.이 경우에는 상태 변경 (체크/선택 취소) 버튼을 다시 그리기 때문에 호출됩니다. 그리고 getView에서 setChecked를 호출하여 리스너를 트리거합니다. holder.favorite.setChecked (true/false)를 호출하기 전에 리스너를 null로 설정하면 이중 트리거가되지 않습니다.

위/아래 문제 정보 - 화면이 뷰일 때 삭제됩니다. 다시 나타나면 getView를 호출하여 holder.favorite.setChecked (true)로 인해 모든 것을 트리거합니다. onCheckChangedLIstener 활성화

관련 문제