2014-01-07 28 views
0

這個問題是,偵聽器OnCheckChangeListener被調用兩次......並且這觸發了這個問題,見下文。複選框OnCheckChange通過按Spinner調用兩次

public class HomeFragmentActivity extends SherlockFragmentActivity { 
... 
@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // TODO Auto-generated method stub 

    switch(item.getItemId()){ 
    case R.id.id_logout: removeSavedCustomer(this); 
      Intent i = new Intent(this , SplashActivity.class); 
      i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK); 
      i.putExtra("activity_change", 0); 
      startActivity(i); 
     break; 
    case R.id.id_compose: 

     AlertDialog.Builder builder = new AlertDialog.Builder(this); 
     ViewGroup view = (ViewGroup) LayoutInflater.from(this).inflate(R.layout.new_message, null); 

     Spinner select = (Spinner) view.findViewById(R.id.messaging_spinner); 

     /** 
     * add spinner adapter and list 
     */ 
     ProjectHelper helper = new ProjectHelper(this); 
     final List<MessageProject> m_project = getSpinnerData(this , helper.getListAsMessage()); 
     // add a dummy 
     m_project.add(0 , new MessageProject()); 

     final SpinnerAdapter adapter = new SpinnerAdapter(this , m_project); 

     select.setAdapter(adapter); 

     final EditText m_title = (EditText) view.findViewById(R.id.messaging_title); 
     final EditText m_content = (EditText) view.findViewById(R.id.messaging_content); 

     final TextView err_spinner = (TextView) view.findViewById(R.id.err_message_spinner); 
     final TextView err_title = (TextView) view.findViewById(R.id.err_message_title); 
     final TextView err_content = (TextView) view.findViewById(R.id.err_message_content); 

     err_spinner.setTextColor(Color.RED); 
     err_title.setTextColor(Color.RED); 
     err_content.setTextColor(Color.RED); 



     m_title.addTextChangedListener(new AfterTextChanged(){ 

      @Override 
      public void abstract_afterTextChanged(Editable s) { 
       // TODO Auto-generated method stub 
       if(!isValidString(s.toString())){ 
        error = true; 
        err_title.setText("Title should not be empty"); 
       }else{ 
        error = false; 
        err_title.setText(""); 
       } 


      } 

     }); 

     m_content.addTextChangedListener(new AfterTextChanged(){ 

      @Override 
      public void abstract_afterTextChanged(Editable s) { 
       // TODO Auto-generated method stub 
       if(!isValidString(s.toString())){ 
        error = true; 
        err_content.setText("Content should not be empty"); 
       }else{ 
        error = false; 
        err_content.setText(""); 
       } 
      } 

     }); 


     Button message = (Button) view.findViewById(R.id.m_btn_message); 
     Button cancel = (Button) view.findViewById(R.id.m_btn_cancel); 

     builder.setView(view); 

     final AlertDialog alert = builder.create(); 

     message.setOnClickListener(new OnClickListener(){ 

      @Override 
      public void onClick(View arg0) { 
       // TODO Auto-generated method stub 
       /** 
       * messaging action 
       */ 
      } 

     }); 

     cancel.setOnClickListener(new OnClickListener(){ 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       alert.dismiss(); 
      } 

     }); 
     alert.show(); 
     break; 


    } 

    return super.onOptionsItemSelected(item); 
} 
} 





public class SpinnerAdapter extends AbstractListAdapter<MessageProject> implements IImageDownload { 

protected static final String TAG = "SpinnerAdapter"; 
private LayoutInflater inflater; 

public SpinnerAdapter(Context context, List<MessageProject> lists) { 
    super(context, lists); 
    // TODO Auto-generated constructor stub 
    inflater = LayoutInflater.from(context); 
} 

@Override 
public View getOverridedView(int position, View child, ViewGroup root) { 
    // TODO Auto-generated method stub 
    ViewHolder holder = null; 
    final MessageProject mprojects = getList().get(position); 
    if(child == null){ 
     holder = new ViewHolder(); 
     child = inflater.inflate(R.layout.message_spinner_projects, null , false); 
     holder.image = (ImageView) child.findViewById(R.id.mp_image); 
     holder.name = (TextView) child.findViewById(R.id.mp_project_name); 
     holder.checkBox = (CheckBox) child.findViewById(R.id.mp_cbox); 

     child.setTag(holder); 
    }else{ 
     holder = (ViewHolder) child.getTag(); 
    } 

    if(position == 0){ 
     holder.name.setText("Select atleast 1"); 
     holder.checkBox.setVisibility(View.INVISIBLE); 
     holder.image.setVisibility(View.INVISIBLE); 
     holder.checkBox.setOnCheckedChangeListener(null); 

    }else{ 
     holder.checkBox.setVisibility(View.VISIBLE); 
     holder.image.setVisibility(View.VISIBLE); 
     holder.name.setText(mprojects.getName()); 
     holder.checkBox.setChecked(mprojects.isCheck()); 

     holder.checkBox.setOnCheckedChangeListener(new OnCheckedChangeListener(){ 

      @Override 
      public void onCheckedChanged(CompoundButton arg0, boolean arg1) { 
       // TODO Auto-generated method stub 
       Log.d(TAG, arg0.toString()); 
       Log.v(TAG, "FROM " + mprojects.isCheck() + " TO " + arg1); 
       mprojects.setCheck(arg1); 
       Log.d(TAG, "Project " + mprojects.getId()); 
       saveSpinnerData(inflater.getContext() , mprojects); 
      } 

     }); 

     /* 
     * download the weak reference bitmap image for imageview 
     */ 
     // remove this when online 
     String replace = mprojects.getImagePath().replace("http://localhost/", Utilities.HOST_NAME); 
     // 
     mprojects.setImagePath(replace); 
     download(mprojects.getImagePath() , holder.image); 
    } 



    return child; 
} 


@Override 
public void download(String url, ImageView view) { 
    // TODO Auto-generated method stub 
    BitmapDownloaderTask task = new BitmapDownloaderTask(view); 
    task.execute(url); 

} 

private class ViewHolder { 
    ImageView image; 
    TextView name; 
    CheckBox checkBox; 
} 
} 
/** 
* get the spinner selected projects if there is 
*/ 
public static List<MessageProject> getSpinnerData(Context context , List<MessageProject> data){ 
    SharedPreferences shared = getPreferences(context); 
    for(MessageProject mproject: data){ 

     Log.d(TAG, "PROEJCT " + mproject.getId() + " = " + shared.getBoolean("message_is_checked_" + mproject.getId(), false)); 
     mproject.setCheck(shared.getBoolean("message_is_checked_" + mproject.getId(), false)); 

    } 

    return data; 

} 
/** 
* save the spinner selected projects 
*/ 
public static void saveSpinnerData(Context context, MessageProject data){ 
    SharedPreferences shared = getPreferences(context); 
    SharedPreferences.Editor editor = shared.edit(); 

    if(shared.getLong("project_id_" + data.getId(), -1) != -1){ 
     editor.putBoolean("message_is_checked_"+data.getId() ,data.isCheck()); 
    }else{ 
     editor.putLong("project_id_" + data.getId(), data.getId()); 
    } 
    editor.commit(); 
} 

http://i.imgur.com/ZorRWT0.png?2

「這裏是微調和複選框的圖像有我的問題,當我推壓回去,當我再次按下微調它被調用了兩次,現在的數據是假的,即使它會被檢查,因爲setOnCheckChangeListener onCheckChanged被調用的不止一次而是兩次,這是怎麼發生的?......可能的解決方案是什麼?「

即時超出解決方案。太糟了。

回答

0

解決! 刪除onCheckChangedListener變化onClickListener 因爲setCheck火災OnCheckChangedListener,愚蠢的我

  holder.checkBox.setOnClickListener(new OnClickListener(){ 

      @Override 
      public void onClick(View arg0) { 
       // TODO Auto-generated method stub 
       Log.d(TAG, arg0.toString()); 
       Log.v(TAG, "FROM " + mprojects.isCheck() + " TO " + !mprojects.isCheck()); 
       mprojects.setCheck(!mprojects.isCheck()); 
       Log.d(TAG, "Project " + mprojects.getId()); 
       saveSpinnerData(inflater.getContext() , mprojects); 
      } 


     }); 

依然任何答覆是非常讚賞,因爲我想用oncheckchangelistener嚴重

它只是奇怪,原因即時按下微調框不是複選框,仍然oncheckchanged偵聽器火災關閉