ذخیره مقدار چکباکس در لیست ویو
سلام.در لیست ویویی شبیه به چیزی که استاد تو آموزش لیست ویو داشت دارم که توش یه checkboxوجود داره .من میخواستم با sharedpreferencesها مقدارtrueیاfalseبودنitem.doneرو ذخیره کنم.با کدی که نوشتم ذخیره میشه ولی به جای این که فقط همون چکباکسی که مدنظرمه تغییر پیدا کنه و مقدارش عوض بشه مقدار همه چکباکس ها عوض میشه.به طوری که انگار همه چکباکس ها رو داره یه چکباکس فرض می کنه و آخرین تغییر روی هر کدوم رو بر روی همه اعمال می کنه.ممنون از راهنمایی شما.این هم کد من:
public class AdapterNote extends ArrayAdapter<StructNote> {
public static SharedPreferences settings;
public static Editor editor;
public AdapterNote(ArrayList<StructNote> array){
super(G.context,R.layout.adapter_notes,array);
}
private static class ViewHolder{
public ViewGroup layoutRoot;
public TextView txtTitle;
public TextView txtDescription;
public CheckBox chkDone;
public ViewHolder(View view){
txtTitle = (TextView)view.findViewById(R.id.txtTitle);
txtDescription = (TextView)view.findViewById(R.id.txtDescription);
chkDone = (CheckBox)view.findViewById(R.id.chkDone);
layoutRoot =(ViewGroup)view.findViewById(R.id.layoutRoot);
}
public void fill(ArrayAdapter<StructNote> adapter,final StructNote item,final int position){
txtTitle.setText(item.title);
txtDescription.setText(item.description);
chkDone.setChecked(item.done);
txtTitle.setTypeface(G.rezvan);
txtDescription.setTypeface(G.rezvan);
layoutRoot.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent =new Intent(G.currentActivity, ActivityTest.class);
intent.putExtra("POSITION", position);
G.currentActivity.startActivity(intent);
}
});
settings = PreferenceManager.getDefaultSharedPreferences(G.currentActivity);
item.done = settings.getBoolean("ITEM_DONE", false);
chkDone.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
CheckBox checkbox = (CheckBox) view;
item.done=checkbox.isChecked();
editor= settings.edit();
if(item.done){editor.putBoolean("ITEM_DONE", true);}
else{editor.putBoolean("ITEM_DONE", false);}
editor.commit();
}
});
editor= settings.edit();
if(item.done){editor.putBoolean("ITEM_DONE", true);}
else{editor.putBoolean("ITEM_DONE", false);}
}}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
StructNote item = getItem(position);
if(convertView==null){
convertView=G.layoutInfalter.inflate(R.layout.adapter_notes,parent,false);
holder=new ViewHolder(convertView);
convertView.setTag(holder);
}
else{
holder=(ViewHolder) convertView.getTag();
}
holder.fill(this, item, position);
return convertView;
}
}

در مرحله ای که تنظیمات رو ذخیره می کنید، رکر نمی کنید که اون تنظیم دقیقا مربوط به کدام مورد از لیست است.
برنامه شما کلا یک کلید به اسم ITEM_DONE دارد که یک مقدار true یا false را می گیرد. برنامه از کجا باید بفهمد که این مقدار، مربوط به کدام یک از ده ها آیتم داخل لیست است؟!
به نظرم راه اصولی انجام چنین پروژه ای استفاده از دیتا بیس است. اما اگر بخواهیم الزاما با sharedPreferences پروژه را انجام بدهیم، آنگاه برای هر آیتم یک کلید جدا نیاز خواهیم داشت. مثلا برای ذخیره تنظیمات بنویسید:
editor.putBoolean("ITEM_DONE" + position,false);
خوب البته این تغییر همان طوری که عرض کردم اصولی نیست. چون ممکنه به دلایل مختلف آیتم های لیست جابجا بشوند. شاید بهتره هر آیتم یک id اختصاصی هم داشته باشد.
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .