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

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

احسان منصوری  12 سال پیش  11 سال پیش
+1 0

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

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

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

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

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

0 0
آقا خیلی خیلی ممنون. واقعا لطف کردی. دستتون درد نکنه (12 سال پیش)
0 0
حل شد؟ (12 سال پیش)
0 0
بله حل شد. تشکر (12 سال پیش)

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