2014-11-17 6 views
0

조각을 열 때마다 모든 체크 박스가 선택되어 있기 때문에 내가 뭔가 잘못하고있는 것처럼 보입니다.SharedPreferences의 체크 박스 상태 저장

그러나 선택을 취소하기 위해 그 중 하나를 클릭하면 checkBox.isChecked가 false 인 savePreference 메소드가 다시 호출됩니다. 그러나 메서드 내부에서 값은 true로 설정됩니다. 따라서 나는 그것이 항상 앱을 실행할 때마다 체크 박스가 항상 선택되어 있다고 가정합니다.

편집 :의 IsChecked는 항상 내가 취소하는 경우에도, 내가 true를 돌려줍니다 여기

내 코드입니다 :

editor.commit(); 

대신

editor.apply(); 

사용하려고

public class FilterAdapter extends BaseAdapter { 

    private Context mContext; 
    private ArrayList<String> mFilters; 
    private ArrayList<Integer> mPictures; 
    private Typeface Bebas, DroidSans; 
    private CheckBox checkBox; 


    public FilterAdapter(Context context, ArrayList<String> filters, ArrayList<Integer> pictures) { 
     this.mContext = context; 
     this.mFilters = filters; 
     this.mPictures = pictures; 
    } 

    @Override 
    public int getCount() { 
     return mFilters.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return mFilters.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     if (convertView == null) { 
      LayoutInflater mInflater = (LayoutInflater) 
        mContext.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
      convertView = mInflater.inflate(R.layout.category_filter_item, null); 
     } 

     checkBox = (CheckBox) convertView.findViewById(R.id.check_box); 
     checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       if (isChecked) 
        savePreferences("CheckBox_Value", checkBox.isChecked()); 
       else { 
        savePreferences("CheckBox_Value", checkBox.isChecked()); 
       } 

      } 
     }); 

     loadSavedPreferences(); 

     DroidSans = Typeface.createFromAsset(mContext.getAssets(), "fonts/DroidSans.ttf"); 

     ImageView filter_img = (ImageView) convertView.findViewById(R.id.category_picture); 
     TextView filter_category = (TextView) convertView.findViewById(R.id.filter_category); 

     filter_category.setTypeface(DroidSans); 
     filter_category.setText(mFilters.get(position)); 
     filter_img.setBackgroundResource(mPictures.get(position)); 


     return convertView; 
    } 

    private void savePreferences(String key, boolean value) { 
     SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(mContext); 
     SharedPreferences.Editor editor = sharedPreferences.edit(); 
     editor.putBoolean(key, value); 
     editor.apply(); 
    } 

    private void loadSavedPreferences() { 
     SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(mContext); 
     boolean checkBoxValue = sharedPreferences.getBoolean("CheckBox_Value", checkBox.isChecked()); 
     if (checkBoxValue) { 
      checkBox.setChecked(true); 
     } else { 
      checkBox.setChecked(false); 
     } 
    } 
} 
+1

http://stackoverflow.com/questions/12621804/saving-state-of-the-checkbox-in-a-custom-list -view-with-checkboxes는이 느슨한 방법을 사용하여이 coz ur을 제안하면이 – MOSO

+1

을 참조하십시오. 뷰어 홀더 패턴을 사용한다. 또한 ur (ischecked) doesnt가 ​​의미를 만들 때 – MOSO

+3

어댑터에 일부가 누락되어 있습니다. 확인란 이상인 경우 왜 sharedPrefarance를 사용 했습니까? 마지막으로 제공된 모든 확인란 값을 무시합니다. 여기에 하나의 열쇠를 가져 왔기 때문에. –

답변

0

1 개월 당신은 다음과 같이 onCheckedChanged 방법에서 직접 부울 값을 전달할 수있는 것은 재 :

 @Override 
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {    
      savePreferences("CheckBox_Value", isChecked); 
     }