آموزش InfiniteScroll در RecyclerView در برنامه نویسی اندروید
سلام دوستان در این سری از آموزش برنامه نویسی اندروید به آموزش InfiniteScroll در RecyclerView در برنامه نویسی اندروید می پردازیم این آموزش بسیار کاربردی است و جلوه زیبایی هم به اپلیکیشن شما می دهد قبلتر آموزش RecyclerView را قرار داده بودیم و مثل همیشه با سرچ می توانید آن را پیدا کنید و نحوه کار به این شکل است که شما هنگام Scroll در RecyclerView به جای اینکه دیتا از قبل لود شود به صورت کم کم و با یک انیمیشن جالب لود می شود و به صورت اسکرول نامحدود خواهد بود در ادامه با ما همراه باشید.شاید بهتر باشد یک پیشنمایشی از آن را ببنید.
ابتدا خط زیر را در بخش dependencies در gradle قرار دهید
1 | compile 'com.github.pwittchen:infinitescroll:0.0.1' |
و یکسری کتاب خانه دیگر برای RecyclerView باید قرار دهیم (آموزش RecyclerView را ابتدا مطالعه کنید)
1 2 3 | compile 'com.android.support:appcompat-v7:23.1.1' compile 'com.android.support:design:23.1.1' compile 'com.android.support:recyclerview-v7:23.1.1' |
به احتمال 90 درصد خط اول یعنی appcompact وجود دارد در صورت وجو این خط را قرار ندهید.
و پروژه خود را Sync کنید (ما قبلا علت خطای گریدل را قرار داده ایم لطفا انقدر سوال نپرسید ابتدا سرچ کنید در سایت !)
به علت درخواست کاربران کل کدها را قرار می دهیم و به مثال های کوتاه نمی پردازیم
و کد بخش activtiy_main.xml همانند زیر می شود.
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 | <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:context=".MainActivity" > <FrameLayout android:id="@+id/toolbar_container" android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/AppTheme.AppBarOverlay" > <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:popupTheme="@style/AppTheme.PopupOverlay" /> </FrameLayout> <ProgressBar android:id="@+id/progress_bar" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:gravity="center_horizontal" android:padding="10dp" android:visibility="gone" /> <android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_above="@+id/progress_bar" android:layout_below="@+id/toolbar_container" android:scrollbars="vertical" android:visibility="visible" /> </RelativeLayout> |
در بالا یک Recyclerview و یک progress بار داریم (شئی های اصلی ما)
که با هر بار اسکرول کاربر ما باید progressbar را به نمایش در بیاریم و بعد دوباره آن را مخفی کنیم.
و کد مربوط به بخش MainActivity.java هم به شکل زیر می شود.
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 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | import android.os.AsyncTask; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.View; import android.widget.ProgressBar; import com.github.pwittchen.infinitescroll.library.InfiniteScrollListener; import java.util.LinkedList; import java.util.List; import pwittchen.github.com.infinitescroll.R; public class MainActivity extends AppCompatActivity { private static final int MAX_ITEMS_PER_REQUEST = 20; private static final int NUMBER_OF_ITEMS = 100; private static final int SIMULATED_LOADING_TIME_IN_MS = 1500; public Toolbar toolbar; public RecyclerView recyclerView; public ProgressBar progressBar; private LinearLayoutManager layoutManager; private List<String> items; private int page; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); this.items = createItems(); initViews(); initRecyclerView(); setSupportActionBar(toolbar); } private static List<String> createItems() { List<String> itemsLocal = new LinkedList<>(); for (int i = 0; i < NUMBER_OF_ITEMS; i++) { String prefix = i < 10 ? "0" : ""; itemsLocal.add("Item #".concat(prefix).concat(String.valueOf(i))); } return itemsLocal; } private void initViews() { toolbar = (Toolbar) findViewById(R.id.toolbar); recyclerView = (RecyclerView) findViewById(R.id.recycler_view); progressBar = (ProgressBar) findViewById(R.id.progress_bar); } private void initRecyclerView() { layoutManager = new LinearLayoutManager(this); recyclerView.setHasFixedSize(true); recyclerView.setLayoutManager(layoutManager); recyclerView.setAdapter(new MyAdapter(items.subList(page, MAX_ITEMS_PER_REQUEST))); recyclerView.addOnScrollListener(createInfiniteScrollListener()); } @NonNull private InfiniteScrollListener createInfiniteScrollListener() { return new InfiniteScrollListener(MAX_ITEMS_PER_REQUEST, layoutManager) { @Override public void onScrolledToEnd(final int firstVisibleItemPosition) { simulateLoading(); int start = ++page * MAX_ITEMS_PER_REQUEST; final boolean allItemsLoaded = start >= items.size(); if (allItemsLoaded) { progressBar.setVisibility(View.GONE); } else { int end = start + MAX_ITEMS_PER_REQUEST; final List<String> itemsLocal = getItemsToBeLoaded(start, end); refreshView(recyclerView, new MyAdapter(itemsLocal), firstVisibleItemPosition); } } }; } @NonNull private List<String> getItemsToBeLoaded(int start, int end) { List<String> newItems = items.subList(start, end); final List<String> oldItems = ((MyAdapter) recyclerView.getAdapter()).getItems(); final List<String> itemsLocal = new LinkedList<>(); itemsLocal.addAll(oldItems); itemsLocal.addAll(newItems); return itemsLocal; } /** * WARNING! This method is only for demo purposes! * Don't do anything like that in your regular project! */ private void simulateLoading() { new AsyncTask<Void, Void, Void>() { @Override protected void onPreExecute() { progressBar.setVisibility(View.VISIBLE); } @Override protected Void doInBackground(Void... params) { try { Thread.sleep(SIMULATED_LOADING_TIME_IN_MS); } catch (InterruptedException e) { Log.e("MainActivity", e.getMessage()); } return null; } @Override protected void onPostExecute(Void param) { progressBar.setVisibility(View.GONE); } }.execute(); } } |
از بالا شروع می کنیم به توضیح دادن تا به پایین
MAX_ITEMS_PER_REQUEST این متغیر برای این است که بیشترین ایتمی که در هر بار می خواهد در RecyclerView لود شود را مشخص کند الان برای 20 است یعنی در هر اسکرول 20 تا اضافه خواهد شد.
NUMBER_OF_ITEMS تعداد کل اون لیست ما است ما از داده sample استفاده کردیم.
SIMULATED_LOADING_TIME_IN_MS مقدار زمانی که هر بار از لود استفاده می شود (هر بار که اسکرول می شود این مقدار زمانی طول بکشد تا دوباره به نمایش در بیایید.)
بعد از آن ما یکسری void را در Oncreate اجرا کردیم که یکی یکی آن ها را بررسی می کنیم.
createItems ساخت داده های sample ما
initViews همان findeViewbyid را با این void انجام می دهیم.
و بخش مهم آن InfiniteScrollListener است که با استفاده از کتاب خانه اولی آن را درست کرده ایم و برای این است که در هر بار اسکرول کار هایی که در بالا گفته شد انجام شود.
simulateLoading شبیه سازی لود شودن داده.
addOnScrollListener و برای اضافه کردن Listiner به RecyclerView از این کد استفاده شده است.
حال باید یک آداپتور ایجاد کنیم علت ایجاد آداپتور را گفته ایم در سایت جستجو کنید !
نام آداپتور ما MyAdapter.java است .
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 | import android.content.Context; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import java.util.List; import pwittchen.github.com.infinitescroll.R; public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private final List<String> items; public MyAdapter(final List<String> items) { this.items = items; } @Override public ViewHolder onCreateViewHolder(final ViewGroup parent, final int viewType) { final Context context = parent.getContext(); final View view = LayoutInflater.from(context).inflate(R.layout.item_main, parent, false); final ViewHolder viewHolder = new ViewHolder(view); return viewHolder; } @Override public void onBindViewHolder(final ViewHolder holder, final int position) { final String itemText = items.get(position); holder.tvItem.setText(itemText); } @Override public int getItemCount() { return items.size(); } public List<String> getItems() { return items; } public class ViewHolder extends RecyclerView.ViewHolder { protected TextView tvItem; public ViewHolder(final View itemView) { super(itemView); tvItem = (TextView) itemView.findViewById(R.id.tv_item); } } } |
به صورت سریع اگر بخواهیم بهش بپردازیم onBindViewHolder مکانی که هر ایتم قرار دارد (position) را برای ما بر می گرداند وبرای قرار دادن داده از ViewHolder استفاده شده است.
این آموزش هم به پایان رسید.
موفق باشید.
سلام
عالیه
خدا قوت
سلام خیلی ممنون
فقط اگه ممکنه این آموزش م هم بزارید
چطور اطلاعات رو از دیتابیس اسکولایت در RecyclerView آموزشی قرار بدید و همیچین ExtanRecyclerView ی آموزشی بزراید ممنونم
سلام قرار می دهیم کمی صبر کنید تعداد آموزش های درخواستی بسیار بالاست.
سلام
بازم ممنون بابت آموزش های خوبتون
ببخشید آموزشی در مورد ExtanRecyclerView که با دیتابیس اسکولایت هم انجام شود کی در سایت قرار می دهید؟
باتشکر