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

مکث در باز شدن اکتیویتی حاوی ViewPager و RecyclerView

rayacoder  9 سال پیش  9 سال پیش
0 0

درود.

من یک اکتیویتی حاوی یک ViewPager دارم که با دو فرگمنت پر میشه. فرگمنت اول ثابته و فرگمنت دوم یک RecyclerView رو در بر داره که اطلاعاتی رو از پایگاه داده میخونه و در قالب 3 یا 4 یا هر تعداد صفحه که لازمه در  ViewPager نمایش میده.

مشکلی که وجود داره اینه که اکتیویتی مذکور بعد از تاخیری چند ثانیه ای باز میشه. علتش اینه که اطلاعات رو میخونه و غیره.

من برای رفع مشکل لگ در هنگام سوایپ کردن از متد setOffscreenPageLimit در ViewPager استفاده کردم که این هم خودش مزید بر علت شده. تلاشهای مکرر و در قالبهای مختلفی رو انجام دادم که اگر بخوام توضیح بدم خیلی طولانی میشه. خواستم مطرح کنم اگر دوستان راه حلی برای این موضوع دارند باهام درمیون بگذارند.

سپاس.

--- اکتیویتی:

 public class ActivityProducts extends ActivityBase {

private ViewPager viewPager;
private PagerAdapter pagerAdapter;
private SmartTabLayout smartTabLayout;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
G.layoutStub(R.layout.activity_products);
prepare();
}

private void prepare() {
pagerAdapter = new PagerAdapter(getSupportFragmentManager(), G.context);
viewPager = (ViewPager) findViewById(R.id.viewPager);
viewPager.setAdapter(pagerAdapter);
viewPager.setCurrentItem(pagerAdapter.getCount());
viewPager.setOffscreenPageLimit(5);
smartTabLayout = (SmartTabLayout) findViewById(R.id.smartTabLayout);
smartTabLayout.setViewPager(viewPager);
}

class PagerAdapter extends FragmentPagerAdapter {

Context context;
int category = 0;
String[][] cats = {
{"Mens", "1"},
{"Womens", "2"},
{"Childs", "3"},
};

public PagerAdapter(FragmentManager fm, Context context) {
super(fm);
this.context = context;
}

@Override
public int getCount() {
return cats.length;
}

@Override
public Fragment getItem(int position) {
if ((position + 1) == cats.length) {
return new FragmentDashboard();
} else {
int catId = Integer.parseInt(cats[position][1]);
FragmentProducts fragment = new FragmentProducts();
fragment.setCatId(catId);
return fragment;
}
}

@Override
public CharSequence getPageTitle(int position) {
return cats[position][0];
}
}
}
 

--- فرگمنت:

 public class FragmentProducts extends Fragment {
private int catId = 0;
private View view;
private ProductAdapter adapter;
private List<Product> products;
private ProductDbh productDbh;
private RecyclerView rv;

@Override
public View onCreateView(final LayoutInflater inflater, final ViewGroup container, Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
view = inflater.inflate(R.layout.fragment_products, container, false);
productDbh = new ProductDbh(G.context);
products = productDbh.readAll(catId);
adapter = new ProductAdapter(products);
rv = (RecyclerView) view.findViewById(R.id.rv);
rv.setLayoutManager(new LinearLayoutManager(G.context));
rv.setAdapter(adapter);
return view;
}

public void setCatId(int catId) {
this.catId = catId;
}
}
 

--- آداپتور هم چیز خاصی نداره چون عملا فعلا چیزی رو پر نمیکنه.

0 0
ضمنا Thread و AsyncTask و غیره هم نمیتونه مشکل رو حل کنه! (9 سال پیش)
0 0
اگه این اکتیویتی اکتیویتیه اصلی برنامتونه یه اسپلش اول برنامه بزارید و اطلاعات رو هنگام نمایش اسپلش بخونید / دریافت کنید (9 سال پیش)
0 0
@admirallam از پاسختون ممنونم ، خیر اکتیویتی اصلی نیست و با لمس کاربر باید باز بشه. (9 سال پیش)
0 0
خوب این چیز تازه ای نیست دوست عزیز و همه جا همینه، viewPager شما وقتی که میخواد load بشه فقط فرگمنت اول رو load نمیکنه و فرگمنت دوم که حاوی اطلاعاتی هست که باید از دیتابیس گرفته بشه هم load میکنه که خود این باعث این وقفه چند ثانیه ای میشه و هیچ راهکاری براش نیست به غیر از اینکه یک آیکن load براش بزارید تا کاربر متوجه وقفه و خواندن اطلاعات بشه. البته من سورس کدتون رو ندیدم و نمیدونم تا چه حدی بهینه کار کردید. یکی دیگه از دلایل این وقفه میتونه کد نویسی بد و غیر اصولی باشه که با بهینه کردنش تا حدودی بهتر میشه (9 سال پیش)
0 0
@امید: خیلی ممنون از پاسخت. بله درسته که صفحه بعدی هم لود میشه ولی این خیلی خوب نیست که برای خوندن اطلاعات از دیتابیس محلی و در حد 20 آیتم برای هر لیست این وقفه به وجود بیاد. البته این وقفه کامل به خاطر لود شدن از دیتابیس نیست ؛ ویو هم موثره ، من برای نمایش آیتمها از لایه ای که حاوی حدود 10 تکست ویو هست باید استفاده کنم. وقتی از لایه سبکتری استفاده میکنم اون وقفه کمتر میشه. سعی کردم در اداپتور مقدار دهی هارو کنسل کنم که اون هم تاثیر خاصی نداشت. در مورد بهینه بودن کد هم میتونم بگم کدنویسیم خوبه و از اصول استاندارد پیروی میکنم. سعی میکنم کدهامو قرار بدم. (9 سال پیش)
0 0
کدهایی که لازم بود رو قرار دادم. (9 سال پیش)
0 0
همون راهی که من گفتم رو پیاده کنید مثلا در اکتیویتی قبلی بعد از لود کانتنت ویو توی یه ترد شروع کنید به لود اطلاعات و اونو در یه آرایه ای چیزی ذخیره کنید (9 سال پیش)
0 0
@admirallam ممنونم دوست عزیز. من این راه رو امتحان نکردم به دلیل اینکه باید همه چیز رو همیشه بخونم حتی مواقعی که ممکنه کاربر به اون بخش اصلا وارد نشه. ولی الان امتحان میکنم. باز هم ممنون. (9 سال پیش)
0 0
فکر میکنم بزرگترین دلیلش میتونه viewPager.setOffscreenPageLimit(5) باشه!!! واقعیت نیاز هست که 6 تا صفحه رو همزمان و در هنگام باز کردن viewPager بارگذاری کنید؟!!! پیشنهاد میکنم این گزینه رو به حالت پیشفرض خودش که یک هست رها کنید، این کار در 90 درصد مواقع جوابگوی کار هست. نهایتا بزارینش روی 2 که این هم توصیه نمیشه (9 سال پیش)
0 0
@امید ، مشکل من خیلی به اون ارتباط نداره. اولا بدون ست کردن تعداد صفحات هم مکث وجود داره. من تعداد صفحه رو ست کردم به خاطر لگ زدن موقع سوایپ. وقتی هم برش میدارم مکث وجود داره اما کمتر. در واقع با برداشتن تعداد صفحه مکث به موقع سوایپ منتقل میشه ! (9 سال پیش)
 برای این سوال 1 پاسخ وجود دارد.
پاسخ به سوال 
rayacoder  9 سال پیش
0 0

@admirallam اطلاعات رو قبل از ورود به اکتیویتی خوندم ، اما تاثیر خاصی نداره. به نظرم این مشکل بیشتر به حافظه ربط پیدا میکنه.


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