آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

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

Reza.M  11 سال پیش  11 سال پیش
0 0

سلام

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

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

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

 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);
                    }
                }
            });

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

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

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

 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  11 سال پیش
0 0

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

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

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

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

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

 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(); } } }
0 0
داداش من نمیفهمم میخوای چکار کنی! چرا هم دیتابیس رو درست میکنی هم کپیش میکنی؟ اطلاعات رو تونستی log کنی؟ (11 سال پیش)
0 0
داداش قربونت برم بهم بفهمون چیکار کنم ، یه برنامه محتوا محور دارم(که محتواش همون بانک اطلاعاتی اسکیوال لایت هستش و از قبل آماده). شما همین کد بالا رو اصلاح کنید و جاهایی که نیاز نیست رو حذف کنید.ممنون (11 سال پیش)
پاسخ به سوال 
sadeghbarout  11 سال پیش
0 0

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

 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();
        }
    }

}

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

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

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