آموزش Load More در اندروید
می خواهیم در اندروید اطلاعات رو از سرور به صورت Lazy Loading یا Load More درRecyclerView نمایش دهیم
به این شکل که با هر بار درخواست ده یا بیست یا n تا آیتم رو نمایش بدیم که این عمل رو Load More می نامن
بخش های Adaper و درخواست به وب سرویس رو توضیح نمی دم چون بحثی جداست
کار به این شکله :
– تعیین گام و فاصله ( در درخواست سمت سرور تعیین می شه ده تای اول یا ده تای دوم یا ده تا سوم رو برای نمایش به شکل Load More نیاز داریم)
– با اسکرول شدن و رسیدن به آخرین آیتم RecyclerView سری جدید رو به صورت Load More درخواست می کنیم
* تا پاسخگویی از سرور یا Local DB درخواست جدیدی نمی فرستیم
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
// برای لاگ گرفتن در مراحل مختلف private static String TAG = "TAG_NAME"; // لیستی از آیتم ها private ArrayList<CustomItem> items = new ArrayList<CustomItem>(); // مکان فعلی RecyclerView privateint currentPosition = 0; // اجازه ارسال درخواست به وب سرویس یا DB private Boolean isLoading = false; // گام ما، مثلا بیستای اول یا بیستای دوم و ... ! ایندکس از 0 شروع می شه private int step = 0; // تعداد موارد دریافتی در هر درخواست private int limit = 20; // دریافت اطلاعات از وب سرویس یا خوانده اطلاعات از DB private void getContent() { isLoading = true; // دریافت اطلاعات از وب سرویس یا خوانده اطلاعات از DB و پر کردن Items // فرض کنیم newItems مقادیر جدیدی است که از سرور دریافت کرده ایم // ArrayList<CustomItem> newItems if(!newItems.isEmpty()) { // در صورت Refresh لیست را خالی کن if(step == 0){ items.clear(); } step += 1; items.addAll(newItems); recyclerViewInitializer(); } else { // اطلاعات جدید موجود نیست } } private void recyclerViewInitializer() { // واریز آیتم ها در Adapter مربوط به RecyclerView Log.d(TAG, TAG + " -> Initial"); recycler_view.setAdapter(new RecyclerViewAdapter(items, getIPlaceListener())); if(currentPosition < items.size() && items.size() > 0) { recycler_view.scrollToPosition(currentPosition); } } // پیش از عملیات بالا فراخوانی شود private void setListeners() { // بررسی اسکرول RecyclerView recycler_view.setOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { } @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { // super.onScrollStateChanged(recyclerView, newState); if (recyclerView.getAdapter() != null) { if (!isLoading) { Log.d(TAG, TAG + " -> Lazy Loading , Get Item Count : " + recyclerView.getAdapter().getItemCount()); if (recyclerView.getAdapter().getItemCount() > 0) { LinearLayoutManager llm = (LinearLayoutManager) recyclerView.getLayoutManager(); currentPosition = llm.findLastVisibleItemPosition(); Log.d(TAG, TAG + " -> Lazy Loading , Current Position : " + currentPosition); if (currentPosition >= items.size() - 2) { Log.d(TAG, TAG + " -> Lazy Loading ..."); getContent(); } } } } } }); } |
در نهایت برای فراخوانی اولیه Load More :
1 2 3 4 |
// ابتدا setListeners(); // سپس getContent(); |