💻 آخرین فرصت یادگیری برنامه‌نویسی با آفر ویژه قبل از افزایش قیمت در آذرماه (🎁 به همراه یک هدیه ارزشمند )
۰ ثانیه
۰ دقیقه
۰ ساعت
۲ پژمان آزاد
باگ برنامه
پوریا شفیعی حل شده توسط پوریا شفیعی

با درود و احترام

 

دو سئوال پیرامون برنامه

اول:

باگ برنامه:

اگر آیتمی در حالت انتخاب برای ادیت بره ولی در این بین و قبل از ادیت و done کردن ، LongClick روی اون آیتم انجام بشه اون آیتم حذف و آیتم بعدی روی حالت انتخاب قرار میگیره و در صورت done کردن، ادیت روی آیتم اشتباه انجام میشه. چگونه میشه این مسئله رو درست کرد؟

دوم:

اگر هنگام حذف آیتمی بخوایم از کاربر برای اطمینان از حذف سئوال بپرسیم که که دکمه ok-cancel داشته باشه. راهکارش چی هست؟

 

ممنون که پیگیری میکنید

سلام و احترام 

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

اما راه پیشنهادی این راه شاید کمی غیر حرفه ای به نظر بیاد ولی من برای ساده بشه اینطوری گفتم 

مراحل:

  • تعریف instanseVariable روبرو در کلاس adapter 
    public static boolean isEdit = false;
  • تغیر متد bind به مراحل زیر (در خط ۸ و ۱۵ مقدار برابر true قرار داده شده که وقتی کاربر روی ایتم مد نظر کلیک کرد مقدار ادیت برابر true بشه که بفهمیم در حال ادیت هستیم و نباید اجازه بدیم که حذف شود که این شرط رو در خط ۱۵ نوشتم)
    public void bindContact(final String fullname) {
                fullnameTv.setText(fullname);
                firstCharacterTv.setText(fullname.substring(0, 1));
                itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        itemEventListener.onItemClick(fullname, getAdapterPosition());
                        isEdit = true;
                    }
                });
                itemView.setOnLongClickListener(new View.OnLongClickListener() {
                    @Override
                    public boolean onLongClick(View v) {
                        if(isEdit==true){
                            return false;
                        }
                        contacts.remove(getAdapterPosition());
                        notifyItemRemoved(getAdapterPosition());
                        return false;
                    }
                });
            }

سپس در MainActivity در خط ۶ مقدار رو fase کردم 

addNewContactBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (fullNameEt.length() > 0) {
                    if (editingItemPosition>-1){
                        ContactsAdapter.isEdit = false;
                        adapter.updateContact(fullNameEt.getText().toString(),editingItemPosition);
                        editingItemPosition = -1;
                        addNewContactBtn.setImageResource(R.drawable.ic_add_white_24dp);
                    }else {
                        adapter.addNewContact(fullNameEt.getText().toString());
                        recyclerView.scrollToPosition(0);
                    }
                    fullNameEt.setText("");
                }
            }
        });

نکته اول : استاتیک تعریق کردم چرا که در هر کلاس بنتوانم به ان دسترسی داشته باشم

نکته دوم : راحل تمیز‌تر این هست که با ستر و گتر یا حتی راه حل بهتر با Enum‌ها این مسیله رو هندل کنیم که در ادامه اشنا خواهی شد 

پس همین راه حل رو در خاطر بسپار 

اما ی نکته ما هیچوقت برای ادیت ایتمی نمیایم این کارا رو انجام بدیم بلکه برای ادیت به کاربر یک دیالوگ نشان میدهیم که به راحتی عمل ادیت را انجام بدهد (ادامه سر فصل Sqlite پروژه تودولیست اشنا خواهی شد)

سوال دوم :برای استفاده از این راه کار سر فصل فایل توضیح داده شده((حذف، کپی و Move کردن فایل)) ( که  

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

---------------------

همونطور که گفتم ما در پروژه ای پیش نمیاد بخواهیم اینطوری عمل ادیت رو انجام بدیم به همین دلییل وقتی دیالوگی به کاربر نشان داده بشه ما میایم اونو cancelable ش رو false قرار میدهیم تا کاربر اجازه بستن دیالوگ نداشته باشه و اینطوری از این باگ جلوگیری میشه 

پیروز باشی پژمان جان

بهترین پاسخ
پوریا شفیعی ۲۶ تیر ۱۳۹۹، ۰۸:۱۷

ممنون پوریا جان.

 

فکر میکنم لزومی به استاتیک معرفی کردن متغیر isEdit نیستا. چون نمونه adapter رو از کلاس ContactAdapter توی کلاس MainActivity داریم که میتونیم براحتی درون MainActivity متغیر isEdit رو صدا بزنیم. درست نمیگم؟

پژمان آزاد ۲۶ تیر ۱۳۹۹، ۱۵:۰۷