2016-07-06 5 views
1

これは私のコードです。何が原因なの? 、最初に実行されisChecked=trueaddFavorite()とそのdeleteFavorite()Android setOnCheckedChangeListenerが2回実行されます

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()となります。

なぜ...

EDIT知ってはいけない:私はダウンスクロールアップ/私の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

In getView。 if/elseの前にsetonCHecked(null)を移動します。

これは、getViewが時間の多くを呼び出すことがあります。この場合、状態を変更すると、ボタンを再描画するため、呼び出されたと思います。また、getViewで、リスナーをトリガーするsetCheckedを呼び出しています。 holder.favorite.setChecked(true/false)を呼び出す前にリスナーをnullに設定すると、ダブルトリガーされません。

アップ/ダウンの問題について - 画面のビューが削除されても同じです。再び表示されると、getViewが呼び出され、holder.favorite.setChecked(true)によってすべてがトリガーされます。onCheckChangedLIstenerをアクティブにします。

関連する問題