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

مشکل در نمایش لیست ویو در tabhost

مدیریت گفتگو
احسان منصوری 12 سال پیش
آخرین تغییر: 12 سال پیش

سلام  خسته نباشید

من یک tabhost دارم که پنج تا تب داره. هر کدوم از تب ها هم به یک اکتیویتی متصله که هر اکتیویتی هم یک لیست ویو داره که اطلاعات رو از بانک میخونه. البته برای همه ی پنج تا لیست ویو، یه دونه adapter نوشتم

مشکلم اینجاس که وقتی روی هر کدوم از تب ها کلیک میکنم، اکتیویتی که باز میشه و اطلاعات لیست ویو نمایش داده میشه، به محض اینکه روی تب دیگه کلیک میکنم و وقتی میخوام برگردم رو تب قبلی و لیست ویو قبلی رو ببینم، اطلاعات لیست ویو قبلی نشون داده نمیشه و لیست ویو جدید نمایش داده میشه. روی هر تب که کلیک میکنم، آخرین لیست ویویی که باز شده رو نمایش میده. اینم سور کد tabhostم. 

       Resources ressources = getResources();
        TabHost tabHost = getTabHost();
        Intent intentRam = new Intent().setClass(this, ActivityRam.class);
        TabSpec tabram = tabHost
                .newTabSpec("RAM")
                .setIndicator("", ressources.getDrawable(R.drawable.ram))
                .setContent(intentRam);
        Intent intentPrinter = new Intent().setClass(this, ActivityPrinter.class);
        TabSpec tabprinter = tabHost
                .newTabSpec("PRINTER")
                .setIndicator("", ressources.getDrawable(R.drawable.printer))
                .setContent(intentPrinter);
        Intent intentCpu = new Intent().setClass(this, ActivityCpu.class);
        TabSpec tabcpu = tabHost
                .newTabSpec("CPU")
                .setIndicator("", ressources.getDrawable(R.drawable.cpu))
                .setContent(intentCpu);
        Intent intentHdd = new Intent().setClass(this, ActivityHdd.class);
        TabSpec tabhdd = tabHost
                .newTabSpec("HDD")
                .setIndicator("", ressources.getDrawable(R.drawable.hdd))
                .setContent(intentHdd);
        Intent intentMouse = new Intent().setClass(this, ActivityMouse.class);
        TabSpec tabmouse = tabHost
                .newTabSpec("MOUSE")
                .setIndicator("", ressources.getDrawable(R.drawable.mouse))
                .setContent(intentMouse);

        tabHost.addTab(tabmouse);
        tabHost.addTab(tabhdd);
        tabHost.addTab(tabcpu);
        tabHost.addTab(tabprinter);
        tabHost.addTab(tabram);

نظرات

hosseinAmini 12 سال پیش
در متده onResume هر اکتویوتی adapter.notifyDataSetChanged(); بنویسید. با اینکار به محض ورود به اکتویتی اطلاعات لیست به روز میشه.
"البته برای همه ی پنج تا لیست ویو، یه دونه adapter نوشتم" چرا؟ حداقلش اینه که خوانایی کد کم میشه. منابع هر ویو رو اگه مختص خودش در نظر بگیرید عیب یابی هم راحت تر انجام میشه. مگر اینکه واقعا طبق سناریو شما الزامی باشه
احسان منصوری 12 سال پیش
آخه همشون از یه بانک اطلاعات رو میخونن. گفتم چرا باید پنج تا adapter بنویسم. یعنی مشکل اینجاس؟
از یه بانک یا از یه جدول؟ نگفتم که مشکل اینجاست. خوانایی کد - تفکیک پذیری کد و n تا چیز دیگه دخل میشن. شاید اگه جدا کنید خودتون خیلی راحت تر مشکل رو بفهمید. مثلا اگه از یه جدول با فیلتر های مختلف دیتا رو میخونید ممکنه مشکل این باشه که فیلتر دیر عوض میشه. با جدا کردن ادپتور ها دیگه نیازی به تعویض فیلتر وجود نداره که مشکل ساز بخواد بشه. (یه مثال بود صرفا)
احسان منصوری 12 سال پیش
از جدول. بله حق با شماس. adapter ها رو جداگانه ساختم ولی باز حل نشد. مشکل از onResume اکتیویتی هاست. نمیدونم چرا توی onResume، لیست ویو ها notifyDataSetChanged نمیشن
احسان منصوری 12 سال پیش
الان ديدم فهميدم كه برنامه توي onResume مشكل داره. نه تنها ليست ويو هاي توي تب ها, بلكه ليست ويو هاي ديگه كه قبل از تب گذاشتم و با كليك كردن روي آيتم هاي اون وارد تب ميشم و onResume شون كار نميكنه
مجتبی یگانه 12 سال پیش
من با تب هاست کار نکردم ، اما لاگ برنامه رو چک کنید ، احتمالا شما مانع از کرش کردن برنامه می شید ، لاگ ایجاد میشه ، برسی نمی کنید ، حدس میزنم باید از Handler استفاده کنید ، چرا که Notify کردن حتی از یک تابع دیگه ممکن نیست و فقط باید از Main Thread یا Handler اتفاق بیافته
احسان منصوری 12 سال پیش
لاگ رو چک میکنم درست کار میکنه. یعنی روی تب دیگه کلیک میکنم، اکتیویتی قبلی pause میشه و اکتیویتی جدید resume. گیج شدم نمیدونم چیکارش کنم
مجتبی یگانه 12 سال پیش
شما Warning ها (نارنجی ها ) رو چک کنید ، میگم که احتمالا باید یه جایی کرش کنه ولی با Try Catch اون قسمت کد رو خفه کردید ، اصلا تو قسمت Catch شما خطا رو چاپ می کنید ؟ e.printStackTrace();z
احسان منصوری 12 سال پیش
والا نمیدونم. یعنی توی آموزش های استاد try/catch ها رو یاد نگرفتم. خیلی واسم سخت بود. واسه همینم براش ننوشتم. وقت دارین پروژمو   آپ کنم یه نگاهی بش بندازین؟
مجتبی یگانه 12 سال پیش
متاسفانه من با تب هاست کارنکردم و همون اول هم گفتم ، پس سورس کد برای من گیج کننده است !
احسان منصوری 12 سال پیش
بله درسته. ممنونم. لینکشو میذارم شاید یه نفر رحمش اومد و درستش کرد:)
سپهر 12 سال پیش
شما چطور برای هر تب یک اکتیویتی تعریف کردید ؟ یعنی زمانی که روی تب ها کلیک میکنید وارد یک اکتیویتی دیگه میشه یا این که در همون tabcontent نمایش داده میشه ؟ اگر لطف کنید و کد xml تب هاستتون رو هم بذارید ممنون میشم
احسان منصوری 12 سال پیش
من برای هر کدوم از تب ها که تعریف کردم، یک اکتیویتی هم نوشتم. بعدش توی اون اکتیویتی که TabHost قرار داره، برای هر تب، یه intent نوشتم و اونو به هر کدوم از اکتیویتی ها متصل کردم. وقتی هم روی هر تب کلیک می کنید، اون اکتیویتی توی همون صفحه باز میشه و به صفحه دیگه نمیره. حالا نمیدونم کدوم کد رو براتون بفرستم. کد XMLش چیز خاصی نداره و همش مقادیر پیش فرضه

پاسخ‌ها 1

محمد حسین زاده 12 سال پیش

کد متد onResume رو به این شکل تغییر بدید:

 
@Override
protected void onResume() {
super.onResume();
if (adapter != null) {
populateFromDatabase();
adapter.notifyDataSetChanged();
}
}

البته مدل کد نویسی ایراد داره. استفاده از یه لیست مشترک و تعریف n تا اکتیویتی عین هم  و ... میشد بجای اینهمه اکتیویتی 1 اکتیویتی با سوییچ دسته بندی داشته باشید که نگهداری برنامه هم براتون راحت تر میشد

نظرات

احسان منصوری 12 سال پیش
آقا خیلی خیلی ممنون. واقعا لطف کردی. دستتون درد نکنه

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