آموزش recyclerview در برنامه نویسی اندروید
سلام دوستان عزیز در این سری از آموزش برنامه نویسی اندروید به آموزش recyclerview در برنامه نویسی اندروید می پردازیم recyclerview ورژن پیشرفته ListView است که کارایی بالاتر و مزیت های بیشتری دارد در این آموزش یاد میگیریم که چه طور یک recyclerview را در layout خود render کنیم با ما همراه باشید.
قبل از هرچیز باید کتاب خانه RecyclerView را به برنامه اضافه کنیم.
برای اینکار وارد فایل Build.gradle از نوع Module شده سپس در بخش dependencies خط زیر را اضافه کنید.
1 | compile 'com.android.support:recyclerview-v7:+' |
پروژه را sync کنید.
ابتدا بخش activity_main را همانند زیر قرار دهید (در آن یک recyclerview قرار داده ایم )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:showIn="@layout/activity_main" tools:context=".MainActivity"> <android.support.v7.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:scrollbars="vertical" /> </RelativeLayout> |
حال باید وارد colors.xml شویم (در res/values قرار دارد) سپس رنگ های زیر را در آن قراد دهید.
1 2 3 4 5 6 7 8 | <?xml version="1.0" encoding="utf-8"?> <resources> <color name="colorPrimary">#3F51B5</color> <color name="colorPrimaryDark">#303F9F</color> <color name="colorAccent">#FF4081</color> <color name="year">#999999</color> <color name="title">#222222</color> </resources> |
حال یک کلاس به نام Movie درست کنید این کلاس برای انجام getter/setter هست (این کلاس قرار دهنده و گیرنده است)
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 | public class Movie { private String title, genre, year; public Movie() { } public Movie(String title, String genre, String year) { this.title = title; this.genre = genre; this.year = year; } public String getTitle() { return title; } public void setTitle(String name) { this.title = name; } public String getYear() { return year; } public void setYear(String year) { this.year = year; } public String getGenre() { return genre; } public void setGenre(String genre) { this.genre = genre; } } |
حالا باید یک فایل 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 | <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:focusable="true" android:paddingLeft="16dp" android:paddingRight="16dp" android:paddingTop="10dp" android:paddingBottom="10dp" android:clickable="true" android:background="?android:attr/selectableItemBackground" android:orientation="vertical"> <TextView android:id="@+id/title" android:textColor="@color/title" android:textSize="16dp" android:textStyle="bold" android:layout_alignParentTop="true" android:layout_width="match_parent" android:layout_height="wrap_content" /> <TextView android:id="@+id/genre" android:layout_below="@id/title" android:layout_width="match_parent" android:layout_height="wrap_content" /> <TextView android:id="@+id/year" android:textColor="@color/year" android:layout_width="wrap_content" android:layout_alignParentRight="true" android:layout_height="wrap_content" /> </RelativeLayout> |
حالا باید هر ایتمی که در Recycler view نمایش داده می شود را ایجاد کنیم یعنی هر آیتمی می شود شامل بخش های بالا (شامل سه Textview که ژانر , سال و نام آن فیلم را مشخص می کند. ) می شود
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 | 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; public class MoviesAdapter extends RecyclerView.Adapter<MoviesAdapter.MyViewHolder> { private List<Movie> moviesList; public class MyViewHolder extends RecyclerView.ViewHolder { public TextView title, year, genre; public MyViewHolder(View view) { super(view); title = (TextView) view.findViewById(R.id.title); genre = (TextView) view.findViewById(R.id.genre); year = (TextView) view.findViewById(R.id.year); } } public MoviesAdapter(List<Movie> moviesList) { this.moviesList = moviesList; } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View itemView = LayoutInflater.from(parent.getContext()) .inflate(R.layout.movie_list_row, parent, false); return new MyViewHolder(itemView); } @Override public void onBindViewHolder(MyViewHolder holder, int position) { Movie movie = moviesList.get(position); holder.title.setText(movie.getTitle()); holder.genre.setText(movie.getGenre()); holder.year.setText(movie.getYear()); } @Override public int getItemCount() { return moviesList.size(); } } |
حال باید یک آداپتور درست کنیم تا مقدار هایی که می خواهیم را در هر یک از ایتم ها ست کند (یعنی نام فیلم , ژانر و سال تولید آن فیلم را در هر یک از آیتم های RecyclerView قرار می دهد) . هر یک از ایتم ها یک Position دارند که بر اساس آن ما مقدار های text خودمون رو به آن ها پاس میدیم و در Textview قرار می گیرد.
حالا وارد بخش 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 | import android.content.Context; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.DefaultItemAnimator; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.view.GestureDetector; import android.view.MotionEvent; import android.view.View; import android.widget.Toast; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { //ساخت یک لیست از نوع فیلم که کلاس آن را تعریف کردیم private List<Movie> movieList = new ArrayList<>(); private RecyclerView recyclerView; // یک آداپتور از همان کلاسی که تعریف کردیم private MoviesAdapter mAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //پیدا کردن تولبار Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); //قراردادن تولبار setSupportActionBar(toolbar); recyclerView = (RecyclerView) findViewById(R.id.recycler_view); mAdapter = new MoviesAdapter(movieList); RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext()); recyclerView.setLayoutManager(mLayoutManager); recyclerView.setItemAnimator(new DefaultItemAnimator()); recyclerView.setAdapter(mAdapter); prepareMovieData(); } private void prepareMovieData() { Movie movie = new Movie("Mad Max: Fury Road", "Action & Adventure", "2015"); movieList.add(movie); movie = new Movie("Inside Out", "Animation, Kids & Family", "2015"); movieList.add(movie); movie = new Movie("Star Wars: Episode VII - The Force Awakens", "Action", "2015"); movieList.add(movie); movie = new Movie("Shaun the Sheep", "Animation", "2015"); movieList.add(movie); movie = new Movie("The Martian", "Science Fiction & Fantasy", "2015"); movieList.add(movie); movie = new Movie("Mission: Impossible Rogue Nation", "Action", "2015"); movieList.add(movie); movie = new Movie("Up", "Animation", "2009"); movieList.add(movie); movie = new Movie("Star Trek", "Science Fiction", "2009"); movieList.add(movie); movie = new Movie("The LEGO Movie", "Animation", "2014"); movieList.add(movie); movie = new Movie("Iron Man", "Action & Adventure", "2008"); movieList.add(movie); movie = new Movie("Aliens", "Science Fiction", "1986"); movieList.add(movie); movie = new Movie("Chicken Run", "Animation", "2000"); movieList.add(movie); movie = new Movie("Back to the Future", "Science Fiction", "1985"); movieList.add(movie); movie = new Movie("Raiders of the Lost Ark", "Action & Adventure", "1981"); movieList.add(movie); movie = new Movie("Goldfinger", "Action & Adventure", "1965"); movieList.add(movie); movie = new Movie("Guardians of the Galaxy", "Science Fiction & Fantasy", "2014"); movieList.add(movie); mAdapter.notifyDataSetChanged(); } } |
در خود کد بعضی از بخش ها رو توضیح دادیم حالا برای اینکه که هر آیتم را اضافه کنیم از کد زیر استفاده کردیم.
1 2 | movie = new Movie("Goldfinger", "Action & Adventure", "1965"); movieList.add(movie); |
تا اینجا آموزش به پایان رسیده ولی شاید بخواهید یک خط برای هر آیتم قرار دهید در لیست این کار خیلی راحت بود ولی در اینجا کمی کار سخت می شود.
یک کلاس به نام DividerItemDecoration.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 | import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.View; /** * Created by Lincoln on 30/10/15. */ public class DividerItemDecoration extends RecyclerView.ItemDecoration { private static final int[] ATTRS = new int[]{ android.R.attr.listDivider }; public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL; public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL; private Drawable mDivider; private int mOrientation; public DividerItemDecoration(Context context, int orientation) { final TypedArray a = context.obtainStyledAttributes(ATTRS); mDivider = a.getDrawable(0); a.recycle(); setOrientation(orientation); } public void setOrientation(int orientation) { if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) { throw new IllegalArgumentException("invalid orientation"); } mOrientation = orientation; } @Override public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) { if (mOrientation == VERTICAL_LIST) { drawVertical(c, parent); } else { drawHorizontal(c, parent); } } public void drawVertical(Canvas c, RecyclerView parent) { final int left = parent.getPaddingLeft(); final int right = parent.getWidth() - parent.getPaddingRight(); final int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child .getLayoutParams(); final int top = child.getBottom() + params.bottomMargin; final int bottom = top + mDivider.getIntrinsicHeight(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } public void drawHorizontal(Canvas c, RecyclerView parent) { final int top = parent.getPaddingTop(); final int bottom = parent.getHeight() - parent.getPaddingBottom(); final int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child .getLayoutParams(); final int left = child.getRight() + params.rightMargin; final int right = left + mDivider.getIntrinsicHeight(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { if (mOrientation == VERTICAL_LIST) { outRect.set(0, 0, 0, mDivider.getIntrinsicHeight()); } else { outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0); } } } |
سپس کد زیر را قبل از recyclerview.setadpater قرار دهید.
1 | recyclerView.addItemDecoration(new DividerItemDecoration(this, LinearLayoutManager.VERTICAL)); |
کد بالا فقط یک خط زیر هر ایتم اضافه می کند
حال بهتر است برایش OnclickListener تعریف کنیم. (تعریف گرفتن کلیک بروی هر یک از آیتم ها)
برای اینکار ما ابتدا یک کلاس به نام RecyclerTouchListener.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 | public interface ClickListener { void onClick(View view, int position); void onLongClick(View view, int position); } public static class RecyclerTouchListener implements RecyclerView.OnItemTouchListener { private GestureDetector gestureDetector; private MainActivity.ClickListener clickListener; public RecyclerTouchListener(Context context, final RecyclerView recyclerView, final MainActivity.ClickListener clickListener) { this.clickListener = clickListener; gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() { @Override public boolean onSingleTapUp(MotionEvent e) { return true; } @Override public void onLongPress(MotionEvent e) { View child = recyclerView.findChildViewUnder(e.getX(), e.getY()); if (child != null && clickListener != null) { clickListener.onLongClick(child, recyclerView.getChildPosition(child)); } } }); } @Override public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) { View child = rv.findChildViewUnder(e.getX(), e.getY()); if (child != null && clickListener != null && gestureDetector.onTouchEvent(e)) { clickListener.onClick(child, rv.getChildPosition(child)); } return false; } @Override public void onTouchEvent(RecyclerView rv, MotionEvent e) { } @Override public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) { } } |
بعد از تعریف آن وارد Mainactivity شوید و کد زیر را بعد از recyclerview.setadapter قرار دهید.
1 2 3 4 5 6 7 8 9 10 | recyclerView.addOnItemTouchListener(new RecyclerTouchListener(getApplicationContext(), recyclerView, new RecyclerTouchListener.ClickListener() { @Override public void onClick(View view, int position) { Movie movie = movieList.get(position); Toast.makeText(getApplicationContext(), movie.getTitle() + " is selected!", Toast.LENGTH_SHORT).show(); } @Override public void onLongClick(View view, int position) { } })); |
و در آخر کد MainActivtiy به شکل زیر می شود.
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 | import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.DefaultItemAnimator; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.view.View; import android.widget.Toast; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { private List<Movie> movieList = new ArrayList<>(); private RecyclerView recyclerView; private MoviesAdapter mAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); recyclerView = (RecyclerView) findViewById(R.id.recycler_view); mAdapter = new MoviesAdapter(movieList); recyclerView.setHasFixedSize(true); RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext()); recyclerView.setLayoutManager(mLayoutManager); recyclerView.addItemDecoration(new DividerItemDecoration(this, LinearLayoutManager.VERTICAL)); recyclerView.setItemAnimator(new DefaultItemAnimator()); recyclerView.setAdapter(mAdapter); recyclerView.addOnItemTouchListener(new RecyclerTouchListener(getApplicationContext(), recyclerView, new RecyclerTouchListener.ClickListener() { @Override public void onClick(View view, int position) { Movie movie = movieList.get(position); Toast.makeText(getApplicationContext(), movie.getTitle() + " is selected!", Toast.LENGTH_SHORT).show(); } @Override public void onLongClick(View view, int position) { } })); prepareMovieData(); } private void prepareMovieData() { Movie movie = new Movie("Mad Max: Fury Road", "Action & Adventure", "2015"); movieList.add(movie); movie = new Movie("Inside Out", "Animation, Kids & Family", "2015"); movieList.add(movie); movie = new Movie("Star Wars: Episode VII - The Force Awakens", "Action", "2015"); movieList.add(movie); movie = new Movie("Shaun the Sheep", "Animation", "2015"); movieList.add(movie); movie = new Movie("The Martian", "Science Fiction & Fantasy", "2015"); movieList.add(movie); movie = new Movie("Mission: Impossible Rogue Nation", "Action", "2015"); movieList.add(movie); movie = new Movie("Up", "Animation", "2009"); movieList.add(movie); movie = new Movie("Star Trek", "Science Fiction", "2009"); movieList.add(movie); movie = new Movie("The LEGO Movie", "Animation", "2014"); movieList.add(movie); movie = new Movie("Iron Man", "Action & Adventure", "2008"); movieList.add(movie); movie = new Movie("Aliens", "Science Fiction", "1986"); movieList.add(movie); movie = new Movie("Chicken Run", "Animation", "2000"); movieList.add(movie); movie = new Movie("Back to the Future", "Science Fiction", "1985"); movieList.add(movie); movie = new Movie("Raiders of the Lost Ark", "Action & Adventure", "1981"); movieList.add(movie); movie = new Movie("Goldfinger", "Action & Adventure", "1965"); movieList.add(movie); movie = new Movie("Guardians of the Galaxy", "Science Fiction & Fantasy", "2014"); movieList.add(movie); mAdapter.notifyDataSetChanged(); } } |
این آموزش هم به پایان رسید.
موفق باشید.
سلام
مرسی برای آموزش های خوبی که می گذارید.
لطفا نحوه ساخت RecyclerView به شکل endless یا infinite رو هم آموزش بدید. یعنی وقتی کاربر کاملا به انتهای لیست اسکرول می کنه آیتم های جدید به انتهای لیست اضافه میشه
مثالهای زیادی در اینترنت هست ولی هیچکدوم کار نمی کنه!
ممنونم
سلام به زودی قرار می دهیم
موفق باشید
آموزش قرار گرفت از لینک زیر استفاده کنید.
http://programchi.ir/2017/07/14/%d8%a2%d9%85%d9%88%d8%b2%d8%b4-infinitescroll-%d8%af%d8%b1-recyclerview-%d8%af%d8%b1-%d8%a8%d8%b1%d9%86%d8%a7%d9%85%d9%87-%d9%86%d9%88%db%8c%d8%b3%db%8c-%d8%a7%d9%86%d8%af%d8%b1%d9%88%db%8c%d8%af/
سلام
ممنون بابت آموزش عالیتون
اگه ممکنه در مورد اینکه چطور اطلاعات رو از دیتابیس اسکولایت در RecyclerView آموزشی قرار بدید و همیچین ExtanRecyclerView ی آموزشی بزراید ممنونم
سلام و دورود
به زودی قرار میگیرد
سلام من چند بار آموزشاتون تست کردم در همه شونم با خطا مواجعه شدم بعضی خطا ها درست شدن بعضی ها نه اخر نشدن و توضیح خیلی کمی میگذارین لطفا آخر آموزش ها یدونه خودتون عملی درست کنید سورس بگذارید ممنون
سلام آموزش ها قبل از قرار گرفتن در سایت تست می شوند سپس قرار می گیرند برای حل مشکل یا خطاتون باید حداقل کمی با base برنامه نویسی اندروید آشنا باشید (مثل AndroidManifest.xml , Gradle , Activity ,Layout ,Style )
صد درصد خطای شما در اضافه نکردن اکتیوییتی به AndroidManifest است (تعریف نشدن هر اکتیویتی) امکان قرار دادن سورس فعلا وجود ندارد ولی به زودی سورس تمامی آموزش ها قرار می گیرد برای به دست آوردن خطا از لوگ گیری استفاده می توانید آموزش زیر را مطالعه کنید تا با نحوه log گیری آشنا شوید
https://programchi.ir/2017/06/22/logcat-%da%86%db%8c%d8%b3%d8%aa-%d8%9f/
و همینطور با استفاده از AndroidMonitor می توانید خطی که خطا دارید را به دست بیارید.
موفق و موید باشید.
ممنون اگر سورس بگذارید راحتر میشود
به زودی انشاالله
سلام خدمت شما. من امروز با سایت شما آشنا شدم و متحیر موندم که این چنین مرجع خوب و به روزی داره تشکیل میشه. خسته نباشید میگم بهتون.
و اما مشکل من:
من یک ویو پیجر ساختم که سه تا تب داره موقتا. یکی از این تب ها علاقه مندی هاست.
داخل recyclerview که توی اکتیویتی قرار دادم تعدادی کارد ویو گذاشتم که از دیتابیس آفلاین اطلاعاتشونو می گیرن.
می خوام به عنوان مثال بعد از کارد ویو 3 و قبل از 4 یک ایمیج ویو قرار بدم که از url (آنلاین) عکسی رو نمایش بده. لطفا راهنمایی کنید چطور این کار رو انجام بدم.(راهنمایی درباره قرار دادن یک آبجکت بین کارد ویو ها) ممنونم.
سلام و درود
خواهش می کنم انشاالله که مورد استفاده عموم قرار بگیره
خب برای این چیزی که شما گفتید همان جا که دارید داده ها را در Recyclerview قرار می دهید باید یک Image View به صورت Programmaticallyایجاد کنید می توانید از کد زیر استفاده کنید.
و برای لود عکس از اینترنت در سایت جستجو کنید به نتیجه می رسید .
موفق و پیروز باشید.
سلام مجدد.
آقای جعفری پور من متوجه نشدم که این کد رو باید توی کدام کلاس قرار داد. ممنون میشم اگر کمی توضیح بدید.
سلام و درود
این کد بسیار گستردگی دارد ابتدا شما باید RecyclerView را قرار دهید بستگی داره می خواید کجا استفاده کنید !
سپس باید یک کلاس از نوع شئی که می خواید در آن قرار دهید بسازید برای اینکه آنها را ست کنید نیاز به Adapter دارید .
موفق باشید.
سلام
میخام در این کد کاری کنم که با کلید بر روی هر ایتیم وارد یک اکتویتی جدید بشه(intent) باید چه کدی و کجا قرار بدم
خواهشا کمکم کنید چون خیلی واجبه
با تشکر
سلام و درود قبلا بخش کلیک بروی RecyclerView را توضیح داده ایم از لینک های زیر استفاده کنید.
آموزش ایجاد رویداد کلیک در RecyclerView
https://programchi.ir/2017/08/03/%d8%a2%d9%85%d9%88%d8%b2%d8%b4-%d8%a7%db%8c%d8%ac%d8%a7%d8%af-%d8%b1%d9%88%db%8c%d8%af%d8%a7%d8%af-%da%a9%d9%84%db%8c%da%a9-%d8%af%d8%b1-recyclerview/
برخی از آموزش های دیگر
http://programchi.ir/?s=%DA%A9%D9%84%DB%8C%DA%A9+%D8%AF%D8%B1+recyclerview
موفق باشید.
آموزشتون عالی بود …روان و ساده
سلام وقت بخیر
ببخشید من همین کد رو پیاده کردم ولی این ارور داده!
No resource identifier found for attribute “layout_behavior” in package “android97shohada
چیکار کنم که برای پکیج من تعریف شده باشه؟
سلام و درود
خط app:layout_behavior را از بخش layout حذف کنید.