بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

ذخیره چک باکس کلیک شده حتی با خروج از اکتیویتی

مدیریت گفتگو
Reza.M 12 سال پیش
آخرین تغییر: 12 سال پیش

سلام

تو قسمت لیست ویو ها چک باکسی دارم که وقتی کلیک شد ، با خروج از اکتیویتی یا برنامه به همون شکل باقی بمونه و بصورت چک شده باقی بمونه

مطمئنم دیدید تو برنامه های پیامکی هم هست ، وقتی روی یه پیام علاقه مندی رو کلیک میکنی و از برنامه خارج میشی ، بعد از ورود مجدد به محیط برنامه ، آیکن علاقه مندی همون پیامک انتخاب شده اس

برای اینکه آیتم رو به لیست علاقه مندی ها اضافه کنم و نمایش بدم مشکلی ندارم
ولی مشکلم اینجاست که چک باکسی که کلیک شده با خروج از اکتیویتی دوباره بصورت انتخاب نشده درمیاد

 favorite_check.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View view) {

                    CheckBox checkbox = (CheckBox) view;
                    item.done = checkbox.isChecked();

                    if (item.done) {
                        Toast.makeText(G.context, "بستنی به لیست علاقه مندی ها افزوده شد", Toast.LENGTH_SHORT).show();
                        G.database.execSQL("UPDATE icecream SET fav=1 WHERE id=" + item.id);
                    } else {
                        Toast.makeText(G.context, "بستنی از لیست علاقه مندی ها حذف گردید", Toast.LENGTH_SHORT).show();
                        G.database.execSQL("UPDATE icecream SET fav=0 WHERE id=" + item.id);
                    }
                }
            });

ممنون میشم راهنمایی کنید.

نظرات

sadeghbarout 12 سال پیش
باید یه بخش برای بررسی fav توی آداپترت داشته باشی. کد کامل آداپترت رو بذار ببینیم مشکل چیه .
sadeghbarout 12 سال پیش
منظورم بررسی done بود.
Reza.M 12 سال پیش
قسمت حذف شم یه کوچولو ایراد داره.تو کد آداپتور مشخصه. ببینید برای اولین بار که آیتمی رو از لیست ویو حذف میکنم به راحتی حذف میشه و ازبانک هم حذف میکنه ولی برای دفعات بعدی عمل نمیکنه. و باید حتما از یه بار از برنامه خارج شم و برگردم اونوقت میتونم دوباره یه آیتم ، رو فقط حذف کنم .
hosseinAmini 12 سال پیش
باید آیدی هر آیتم رو به adapter ارسال کنی و توی adapter بگی که مقدار فیلد fav (مثلا اسم فیلد علاقه ها fav هست) در سطری که آیدیش برابر با آیدی آیتم هست رو بر گردون. اگر 1 بود چک باکس انتخاب شده باشه اکر هم 0 بود انتخاب نشده

پاسخ‌ها 4

Reza.M 12 سال پیش

اینم کد کامل آداپتر

 public class AdapterNote extends ArrayAdapter<StructNote> {

    public AdapterNote(ArrayList<StructNote> array) {
        super(G.context, R.layout.adapter_notes, array);
    }


    public static class ViewHolder {

        public ImageView    imgDelete;
        public TextView        txtDescription;
        public static CheckBox favorite_check;



        public ViewHolder(View view) {
            txtDescription = (TextView) view.findViewById(R.id.txtDescription);
            imgDelete = (ImageView) view.findViewById(R.id.imgDelete);
            favorite_check = (CheckBox) view.findViewById(R.id.favorite_check);
        }


        public void fill(final ArrayAdapter<StructNote> adapter, final StructNote item, final int position) {
            txtDescription.setText(item.sms_text + item.sms_id);
            favorite_check.setChecked(item.done);

            imgDelete.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View arg0) {
                    AlertDialog.Builder biulder = new AlertDialog.Builder(G.currentActivity);
                    biulder.setIcon(android.R.drawable.ic_dialog_alert)
                            .setTitle("هشدار !")
                            .setMessage("پس از حذف ، گزینه مورد نظر قابل بازگشت نخواهد بود آیا اطمینان دارید؟")
                            .setPositiveButton("بله", new DialogInterface.OnClickListener() {

                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    adapter.remove(item);
                                    G.database.execSQL("DELETE FROM icecream WHERE id=" + item.id);
                          
                                }
                            })
                            .setNegativeButton("خیر", new DialogInterface.OnClickListener() {

                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    dialog.cancel();
                                }
                            });
                    biulder.create().show();
                    adapter.notifyDataSetChanged();
                }
            });
            
favorite_check.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { CheckBox checkbox = (CheckBox) view; item.done = checkbox.isChecked(); if (item.done) { Toast.makeText(G.context, "بستنی به لیست علاقه مندی ها افزوده شد", Toast.LENGTH_SHORT).show(); G.database.execSQL("UPDATE icecream SET fav=1 WHERE id=" + item.id);
} else { Toast.makeText(G.context, "بستنی از لیست علاقه مندی ها حذف گردید", Toast.LENGTH_SHORT).show(); G.database.execSQL("UPDATE icecream SET fav=0 WHERE id=" + item.id);
} } }); } } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; StructNote item = getItem(position); if (convertView == null) { convertView = G.inflater.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; } }

نظرات

sadeghbarout 12 سال پیش

سوال اولت رو نمیدونم! چک کن ببین اصلا تغییرات تو دیتابیس ثبت میشه؟ اگه آره بعد  مقدار ها رو logکن و چکشون کن ببینخوندنش از دیتابیس هم  درسته یا نه؟

برای سوال دومت مطمئن نیستم چون باید تست بشه ولی شاید مشکل از همون adapter.remove(item); باشه

بیا به جای حذف ایتم از adapter، از اون آرایه اصلی که به آداپتر معرفی کردی اون آیتم رو حذف کن احتمال قوی درست میشه

نظرات

Reza.M 12 سال پیش
درمورد سوال علاقه مندی ها : وقتی که روی چک باکس علاقه مندی کلیک میشه تو دیتابیس ذخیره میشه و وقتی هم لیست علاقه ها رو میزنم همونایی که چک باکسشونو ، بصورت انتخاب درآوردم رو نشون میده و مشکلی نیست تنها مشکل اینه که با خروج از اکتیویتی چک باکس آیتمی که به لیست علاقه ها اضافه شده بصورت انتخاب نشده درمیاد.
sadeghbarout 12 سال پیش
خب موقع ورود مگه اطلاعات از دیتابیس خونده نمیشن دوباره؟ مقادیر خونده شده رو log کن تا مشکلو پیدا کنی. ببین نکنه دیتابیس خالی رو هربار موقع ورود دوباره کپی میکنی؟!
Reza.M 12 سال پیش
دوست عزیز (Sadeghbarout) ممنون که وقت گذاشتید.اول بگید اصلان کد آداپتور بنده ایرادی چیزی نداره ؟ شاید اصلا ایراد از کد آداپتور باشه. در ضمن کد اون قسمتی رو که به دیتابیس وصل میشه رو هم پایین میگذارم ببین شایدم از کدم اشتباه باشه و برای هر بار بانک از نو کپی میشه !!! بازم تشکر میکنم
Reza.M 12 سال پیش
مشکل حذف آیتم از دیالوگ حذف بود (دیالوگی که از کاربر سوال میکنه که : آیا از حذف آیتم مطمئن هستید). دیالوگ رو برداشتم مستقیم هم از لیست هم از بانک حذف میشه.ولی خب حالا دیالوگ رو چیکار کنم.
Reza.M 12 سال پیش

اینم کد اتصال به بانک اطلاعاتی

 public class G extends Application {

    public static Context               context;
    public static LayoutInflater        inflater;
public static SQLiteDatabase database;
public static Activity currentActivity;
public static final Handler HANDLER = new Handler(); public static ArrayList<StructNote> notes = new ArrayList<StructNote>(); public static final String DIR_SDCARD = Environment.getExternalStorageDirectory().getAbsolutePath(); public static final String DIR_APP = DIR_SDCARD + "/icecream"; @Override public void onCreate() {
super.onCreate(); context = this.getApplicationContext(); inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); new File(DIR_APP).mkdirs(); File file = new File(DIR_APP + "/icecreamdata.sqlite");
if ( !file.exists()) { copydb(); } database = SQLiteDatabase.openOrCreateDatabase(DIR_APP + "/icecreamdata.sqlite", null);
database.execSQL("CREATE TABLE IF NOT EXISTS icecream(" +
"id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE ," + "category TEXT," + "title TEXT," + "fav TINYINT" + ")"); } private void copydb() { AssetManager assetManager = context.getAssets(); InputStream inputStream; try { inputStream = assetManager.open("icecreamdata.sqlite");
HelperIO.copyFile(inputStream, DIR_APP + "/icecreamdata.sqlite");
} catch (IOException e) { e.printStackTrace(); } } }

نظرات

sadeghbarout 12 سال پیش
داداش من نمیفهمم میخوای چکار کنی! چرا هم دیتابیس رو درست میکنی هم کپیش میکنی؟ اطلاعات رو تونستی log کنی؟
Reza.M 12 سال پیش
داداش قربونت برم بهم بفهمون چیکار کنم ، یه برنامه محتوا محور دارم(که محتواش همون بانک اطلاعاتی اسکیوال لایت هستش و از قبل آماده). شما همین کد بالا رو اصلاح کنید و جاهایی که نیاز نیست رو حذف کنید.ممنون
sadeghbarout 12 سال پیش

صحت کدهات رو چک نکردم ولی اگه کدهات کار کنن قسمت ساخت دیتابیس نیاز نبود :

 public class G extends Application {

    public static Context               context;
    public static LayoutInflater        inflater;
public static SQLiteDatabase        database;
    public static Activity              currentActivity;    
    public static final Handler         HANDLER    = new Handler();
    public static ArrayList<StructNote> notes      = new ArrayList<StructNote>();
   
    public static final String          DIR_SDCARD = Environment.getExternalStorageDirectory().getAbsolutePath();
    public static final String          DIR_APP    = DIR_SDCARD + "/icecream";



    @Override
    public void onCreate() {

        super.onCreate();
        context = this.getApplicationContext();
        inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        new File(DIR_APP).mkdirs();
        File file = new File(DIR_APP + "/icecreamdata.sqlite");

        if ( !file.exists()) {
            copydb();
        }


        database = SQLiteDatabase.openOrCreateDatabase(DIR_APP + "/icecreamdata.sqlite", null);
       
    }


    private void copydb() {

        AssetManager assetManager = context.getAssets();
        InputStream inputStream;
        try {
            inputStream = assetManager.open("icecreamdata.sqlite");
            HelperIO.copyFile(inputStream, DIR_APP + "/icecreamdata.sqlite");
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }

}

الان باید بتونی از دیتابیس اطلاعات رو بخونی

نظرات

Reza.M 12 سال پیش
ممنون داداش.خب اینو حل کردی. قسمت علاقه مندی هارو چیکارش کنیم؟ ببین داداش همونطور که تو کدهای آداپتور و نمایش لیست مشخصه ، وقتی روی آیکن ستاره(همون چک باکس) کلیک میکنم تو دیتابیس ذخیره میشه (صفر و به 1 آپدیت میکنه) که بعد تو لیست علاقه مندی ها همه آیتم هایی رو که fav شون 1 هست رو نشون میده و هیچ مشکلی نیست. ولی مشکل اینجاست اون ستاره که کلیک شده ، بعد از خروج از اکتیویتی و برنامه کلیک ش از بین میره حداقل از لحاظ ظاهری (چون وقتی کلیک شده تو دیتابیس ذخیره شده). معمول ش اینه که آیتمی که به علاقه مندی ها اضافه میشه ، همیشه ستاره دار باشه ، که کاربر دوباره روش کلیک نکنه و نشون دهنده این باشه که آیتم جزو علاقه مندی ها س حالا ما موندیم کد رو چطوری تغییر بدیم که درست بشه. -2-مورد حذف هم گفتم ایراد داره. فهمیدم ایرادش از دیالوگ حذف بود (دیالوگی که از کاربر سوال میکنه که : آیا از حذف آیتم مطمئن هستید) ، دیالوگ رو که برداشتم بطور مستقیم وقتی روی آیکن حذف کلیک میکنم هم از لیست هم از بانک حذف میشه. ولی هر طور شده به یه دیالوگ نیاز دارم که حذف رو هشدار بده که درصورت انتخاب بله عمل حذف انجام بشه .
SaLaH KuRD 12 سال پیش
سلام دوست عزیز شما باید لیستت رو دوباره لود کنی ( توی onResume ) .
sadeghbarout 12 سال پیش
داداش من 3 باره دارم یه حرفو میزنم شما اصلا توجه نمیکنی. میگم داده ها رو log کن تا مشکل کارت رو پیدا کنی. موقعی که از دیتابیس میخونیشون همونجا logکن ببین مقدارشون 1 هست یا نه. یعد برو تو آداپتر log شون کن ببین اونحا هم 1 هستن؟ بعد قبل if یه log بذار ببین اجرا میشه؟ یعد توی if ت یه log بذار ببین اصلا شرط if ت درسته؟ و... همینجور باید بری جلو تا حل بهش دیگه!
Reza.M 12 سال پیش
از همه دوستان ممنونم. به گفته داداشم (Sadeghbarout) میخوام انقد Log کنم تا مشکل رو پیدا کنم ... ( '_' )

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .