باگ برنامه

پرسیده شده
فعالیت 1383 روز پیش
دیده شده 557 بار
1

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

 

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

اول:

باگ برنامه:

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

دوم:

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

 

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

فایل پیوست

پژمان آزاد
پژمان آزاد

25 تیر 99

3
حذف شده

سلام و احترام 

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

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

مراحل:

  • تعریف 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 قرار میدهیم تا کاربر اجازه بستن دیالوگ نداشته باشه و اینطوری از این باگ جلوگیری میشه 

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

فایل پیوست

پوریا شفیعی

توسط

پوریا شفیعی

26 تیر 99

1
حذف شده

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

 

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

فایل پیوست

پژمان آزاد

توسط

پژمان آزاد

26 تیر 99

حذف شده
برای حل مسئله تعداد زیادی روش وجود داره دقیقا همینطوره نیاز نیست در این روش . ولی مسلما باید پابلیک باشه کلا اگر برنامه جواب بده و کار کنه یعنی ردیفه?⁦ البته یه نکته بگم کسی که متغیر هاشو public در نظر میگیره یعنی از شی گرایی استفاده نکرده برای این عمل میتونی از ستروگتر استفاده کنی یا راه حل بهتر استفاده از Enum ها اصلا نیاز نیست فعلا سراغ این مسائل بری عجله نکن پسر ادامه بده آشنا میشی
پوریا شفیعی

26 تیر 99

حذف شده
نمی‌دونم چرا فرمت سوال بهم ریخت شاید واسه خاطر این هست با گوشی تایپ کردم اما در کل گفتم که آره نیاز نیست و راه حل قشنگ تر و شی گرا ترش استفاده از اینام هست . موفق باشیی
پوریا شفیعی

26 تیر 99

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

26 تیر 99