کار با RecyclerView و CardView متریال دیزاین

در طراحی و توسعه برنامه‌های موبایلی و بخصوص اپلیکیشن‌های اندرویدی، استفاده از لیست‌ها کاربرد فراوانی برای نمایش اطلاعات و محتوا دارد. مانند نمایش لیست تراکنش‌های حساب شخص در یک برنامه بانکی یا نمایش لیست شهرها در یک برنامه ویژه گردشگری. در این بخش به نحوه پیاده سازی لیست ها با استفاده از RecyclerView و CardView در اندروید می پردازیم که شامل مباحث زیر می باشد:

آنچه در این آموزش می‌خوانید:

  • معرفی کامپوننت RecyclerView و بررسی مزایای آن نسبت به ListView
  • آشنایی با کلاس Model
  • آشنایی با ViewHolder
  • آشنایی با Adapter در RecyclerView و متدهای آن
  • ساخت یک لیست و نمایش آن در قالب آیتم‌های یک RecyclerView
  • کار با متدهای LinearLayoutManager، GridLayoutManager و StaggeredGridLayoutManager جهت تعیین نحوه چیدمان آیتم‌ها
  • آشنایی با کامپوننت CardView و نحوه استفاده از آن در پروژه و طراحی لایه ها

این مبحث در قالب PDF و در ۴۸ صفحه تهیه شده که در ادامه چند صفحه‌ی ابتدایی آن را مشاهده می کنید:

معرفی RecyclerView:

به نام خدا. در فصل پنجم با کامپوننت/ویجت ListView آشنا شدیم. از ListView برای نمایش آیتم ها در قالب یک لیست استفاده کردیم. با معرفی متریال دیزاین در اندروید، ViewGroup یا ویجت RecyclerView نیز به عنوان یک جایگزین حرفه ای برای ListView و GridView معرفی شد. RecyclerView مزیت هایی نسبت به ListView دارد از جمله:
– بهینه است و حافظه بهتر مدیریت می شود. در RecyclerView فقط آیتم هایی که در صفحه نمایش قرار گرفته اند (به همراه چند آیتم قبل و بعد آنها) روی حافظه بارگزاری می شود نه همه آیتم های لیست.
– مدیریت RecyclerView ساده تر است و به راحتی می توان نحوه چینش آیتم ها (افقی یا عمودی) و همچنین در صورت نیاز به ستون بندی، تعداد ستونها را تعیین کرد.
– در RecyclerView امکان پیاده سازی انیمیشن برای زیباتر شدن نحوه اضافه و یا حذف شدن آیتم ها فراهم شده است.

RecyclerView لیستی از آیتم ها را نمایش می دهد که قابل Scroll بوده و محدودیتی در تعداد آیتم ها ندارد. از نمونه های کاربردی می توان به پیام رسان ها، لیست مخاطبین تلفن همراه، لیست ایمیل‌ها و یا لیست شهرها به همراه اطلاعات آب و هوایی مربوط به آنها در یک اپلیکیشن هواشناسی اشاره کرد.

نمایش لیست ایمیل توسط RecyclerView

تصویر بالا یک اپ مدیریت ایمیل است که هر آیتم از لیست شامل عنوان، نام فرستنده و چند کلمه ابتدای متن ایمیل می باشد. در سمت راست نیز زمان دریافت و آیکون ستاره جهت علامت زدن موارد مهم قرار دارد.

نمایش لیست ایمیل توسط RecyclerView

تصویر بالا مربوط به پیام رسان WhatsApp است. اینجا هم مانند مثال قبل، آیتم های لیست دارای عناصر مشترکی هستند. یک تصویر پروفایل، نام شخص و چند کلمه ابتدای پیغام دریافتی. در سمت راست نیز زمان دریافت پیغام مشخص شده است.
برای ساخت و نمایش لیست ها در RecyclerView مانند ListView ابتدا باید یک قالب کلی برای نمایش یک آیتم طراحی کنیم. سپس اطلاعاتی که قصد نمایش آنها در قالب لیست داریم را یک به یک به قالب از قبل طراحی شده می‌فرستیم تا همگی با یک فرمت و ظاهر مشخص و یکسان نمایش داده شوند.
بنابراین در RecyclerView امکان شخصی سازی را داریم و آیتم ها از ساده ترین حالت یعنی یک text تا یک آیتم پیچیده (ترکیبی از تصویر، متن، لینک و…) قابل پیاده سازی هستند. داده ها از منابعی مانند آرایه ها،دیتابیس، سرور و… به RecyclerView منتقل و نمایش داده می شوند.
توصیه می کنم قبل از مطالعه این مبحث حتما یکبار مبحث ListView را نیز مطالعه و تمرین کنید تا تفاوت بین این دو ویجت بهتر برایتان ملموس شود. ضمن اینکه برخی از جزئیات که در هردو مبحث مشترک است را در اینجا بطور خلاصه بیان می کنم.
در اندروید استودیو یک پروژه جدید با نام RecyclerView و یک Empty Activity ایجاد می کنم. برای استفاده از RecyclerView باید کتابخانه آنرا به پروژه اضافه کنیم که از کتابخانه های متعلق به support است. مطابق مباحث گذشته، کتابخانه را به دو صورت اضافه کردن دستی به فایل build.gradle و یا مسیر:

File > Project Structure > Modules (app) > Dependencies > + > Library Dependency

به پروژه اضافه می کنم:

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.android.support:appcompat-v7:27.0.2'
    implementation 'com.android.support:recyclerview-v7:27.0.2'
}

پس از سینک شدن موفق پروژه، یک ویجت/کامپوننت از نوع RecyclerView در لایه اکتیویتی اصلی پروژه یعنی activity_main.xml تعریف می کنم:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="ir.android_studio.recyclerview.MainActivity">

    <android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/recycler_view"/>

</RelativeLayout>

سپس RecyclerView را به فایل جاوا اکتیویتی اضافه می کنم:

MainActivity.java:

package ir.android_studio.recyclerview;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.RecyclerView;

public class MainActivity extends AppCompatActivity {

    RecyclerView myRecycler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        myRecycler = findViewById(R.id.recycler_view);

    }
}
نکته: در نسخه ۳ اندروید استودیو و به بعد، عمل Casting در تعریف کردن view ها در کلاس جاوا الزامی نیست. با اینحال چنانچه با ارور مواجه شدید لازم است Casting را انجام دهید. یعنی در اینجا باید (RecyclerView) به قبل از findViewById اضافه شود:

myRecycler = (RecyclerView) findViewById(R.id.recycler_view);

مانند مبحث ListView برای مدیریت ویجت / view ها و ارتباط آنها با عملگرهای جاوا، از کلاسی استفاده می کنیم که اصطلاحا Model نامیده می شود. استفاده از چنین کلاسی الزامی نیست اما باعث می شود مدیریت بهتری روی پروژه داشته باشیم. در کلاس Model از متدهایی که اصطلاحا Getter و Setter نامیده می شوند برای مقداردهی به متغیرها و یا مقدارگیری از آنها استفاده می شود.
برای ساخت Model، یک کلاس با نام دلخواه Item به پکیج اصلی پروژه اضافه می کنم:

اضافه کردن کلاس Model به پروژه اندروید

package ir.android_studio.recyclerview;

public class Item {

    private int uAvatar;
    private String uName;
    private String uMessage;
    private String uTime;

}

می خواهم هر یک از آیتم های RecyclerView حاوی یک تصویر پروفایل، نام، متن پیغام و تاریخ ارسال باشد.
چهار متغیر در کلاس تعریف کردم که یکی برای نمایش تصویر شخص و سه مورد دیگر برای نمایش نام، متن پیغام و تاریخ استفاده خواهد شد. در ادامه متدهای سازنده (Constructor) و همچنین Getter & Setter را به کلاس مدل اضافه می کنم:

package ir.android_studio.recyclerview;

public class Item {

    private int uAvatar;
    private String uName;
    private String uMessage;
    private String uTime;

    public Item(int uAvatar, String uName, String uMessage, String uTime) {
        this.uAvatar = uAvatar;
        this.uName = uName;
        this.uMessage = uMessage;
        this.uTime = uTime;
    }

    public int getuAvatar() {
        return uAvatar;
    }

    public void setuAvatar(int uAvatar) {
        this.uAvatar = uAvatar;
    }

    public String getuName() {
        return uName;
    }

    public void setuName(String uName) {
        this.uName = uName;
    }

    public String getuMessage() {
        return uMessage;
    }

    public void setuMessage(String uMessage) {
        this.uMessage = uMessage;
    }

    public String getuTime() {
        return uTime;
    }

    public void setuTime(String uTime) {
        this.uTime = uTime;
    }
    
}

جزئیات مربوط به نحوه افزودن این متدها به کلاس را در مبحث ListView توضیح داده ام.
در ابتدای مبحث گفتیم برای نمایش آیتم های لیست از یک قالب مشترک استفاده می شود که هر آیتم با همان فرمت و چینش طراحی به RecyclerView فرستاده می شود. من دقیقا همان قالبی که در مبحث ListView (لیست سفارشی) طراحی کرده بودم را در این پروژه استفاده می کنم. یک فایل با نام list_item به دایرکتوری layout پروژه اضافه می کنم:

ساخت layout نمایش آیتم RecyclerView

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="100dp"
    android:padding="5dp"
    android:orientation="horizontal">

    <ImageView
        android:id="@+id/img_avatar"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="0.2"
        android:src="@drawable/avatar_1" />

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="0.8"
        android:orientation="vertical">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="0.5"
            android:orientation="horizontal">

            <TextView
                android:id="@+id/txt_name"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="bottom"
                android:paddingLeft="5dp"
                android:text="Name" />

            <TextView
                android:id="@+id/txt_time"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:layout_weight="1"
                android:gravity="bottom|right"
                android:text="Time" />
        </LinearLayout>

        <TextView
            android:id="@+id/txt_message"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_marginTop="5dp"
            android:layout_weight="0.5"
            android:paddingLeft="5dp"
            android:text="Message"
            android:textColor="#161111" />

    </LinearLayout>

</LinearLayout>

این لایه شامل یک ImageView و سه TextView است. یک تصویر هم در دایرکتوری drawable برای نمایش مکان آواتار در قسمت Preview اندروید استودیو قرار دادم.خروجی list_item.xml در بخش پیش نمایش به اینصورت است:

پیش نمایش لایه آیتم RecyclerView

در مرحله بعد برای مدیریت view ها و ارسال داده های دریافتی (شامل آدرس تصویر پروفایل، نام، متن پیغام و تاریخ) به آنها، نیاز به ساخت یک کلاس Adapter داریم. بنابراین یک کلاس دیگر با نام دلخواه ItemAdapter به پکیج اصلی پروژه اضافه می کنم:

ساخت کلاس Adapter برای RecyclerView

اگر بخاطر داشته باشید در ListView برای بهینه تر شدن برنامه، یک ViewHolder تعریف کردیم. در RecyclerView هم این مورد درون کتابخانه تعبیه شده و برای تعریف view ها باید از ViewHolder استفاده کنیم. داخل کلاس آداپتر قبل از هرکار ابتدا یک کلاس داخلی (inner class) برای ViewHolder ایجاد و آنرا تکمیل می کنم:

package ir.android_studio.recyclerview;

import android.support.v7.widget.RecyclerView;

public class ItemAdapter {

    public class MyViewHolder extends RecyclerView.ViewHolder {}

}

یک کلاس داخلی با نام دلخواه MyViewHolder به کلاس ItemAdapter اضافه کردم. این کلاس باید از کلاس ViewHolder ارث بری شود و با توجه به اینکه ViewHolder در کتابخانه RecyclerView تعریف شده، کلاس را باید از RecyclerView.ViewHolder ارث بری کنیم.
View ها را داخل MyViewHolder تعریف می کنم:

public class MyViewHolder extends RecyclerView.ViewHolder {

    public ImageView aAvatar;
    public TextView aName;
    public TextView aMessage;
    public TextView aTime;

}

در بدنه کلاس MyViewHolder خطایی مشاهده می شود که با قراردادن نشانگر روی آن و زدن alt+Enter از ما می خواهد متد سازنده را به کلاس اضافه کنیم:

متد سازنده ViewHolder

public class MyViewHolder extends RecyclerView.ViewHolder {

    public ImageView aAvatar;
    public TextView aName;
    public TextView aMessage;
    public TextView aTime;


    public MyViewHolder(View itemView) {
        super(itemView);
    }
}

حالا view ها را درون متد سازنده به متغیر مربوط به خودشان متصل می کنم:

public class MyViewHolder extends RecyclerView.ViewHolder {

    public ImageView aAvatar;
    public TextView aName;
    public TextView aMessage;
    public TextView aTime;


    public MyViewHolder(View itemView) {
        super(itemView);
        
        aAvatar = itemView.findViewById(R.id.img_avatar);
        aName = itemView.findViewById(R.id.txt_name);
        aMessage = itemView.findViewById(R.id.txt_message);
        aTime = itemView.findViewById(R.id.txt_time);
    }
}

ملاحظه می کنید در اینجا قبل از findViewById به واسطه itemView که از جنس View است تعریف شده و به تنهایی نمی توان استفاده کرد. در واقع itemView شامل هریک از آیتم های RecyclerView می باشد. فعلا با MyViewHolder کاری ندارم.
پس از ساخت ViewHolder، لازم است کلاس ItemAdapter از RecyclerView.Adapter ارث بری شود:

ارث بری کلاس Adapter از RecyclerView.Adapter

مشاهده می کنید در لیست پیشنهادی، در مقابل Adapter عبارت VH (مخفف ViewHolder) قید شده به این معنی که در اینجا باید کلاسی که از ViewHolder اصطلاحا کاستوم کردیم را وارد کنیم:

ارث بری کلاس Adapter از RecyclerView.Adapter

در نهایت کلاس به اینصورت تکمیل می شود:

package ir.android_studio.recyclerview;

import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

public class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.MyViewHolder> {

    public class MyViewHolder extends RecyclerView.ViewHolder {

        public ImageView aAvatar;
        public TextView aName;
        public TextView aMessage;
        public TextView aTime;


        public MyViewHolder(View itemView) {
            super(itemView);

            aAvatar = itemView.findViewById(R.id.img_avatar);
            aName = itemView.findViewById(R.id.txt_name);
            aMessage = itemView.findViewById(R.id.txt_message);
            aTime = itemView.findViewById(R.id.txt_time);
        }
    }

}

مجدد در بدنه کلاس اصلی هم خطا میگیرم که با alt+Enter متدهای ضروری Adapter را اضافه می کنم:

متدهای Adapter

متدهای Adapter

package ir.android_studio.recyclerview;

import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

public class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.MyViewHolder> {

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return null;
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {

    }

    @Override
    public int getItemCount() {
        return 0;
    }

    public class MyViewHolder extends RecyclerView.ViewHolder {

        public ImageView aAvatar;
        public TextView aName;
        public TextView aMessage;
        public TextView aTime;


        public MyViewHolder(View itemView) {
            super(itemView);

            aAvatar = itemView.findViewById(R.id.img_avatar);
            aName = itemView.findViewById(R.id.txt_name);
            aMessage = itemView.findViewById(R.id.txt_message);
            aTime = itemView.findViewById(R.id.txt_time);
        }
    }

}

جهت مطالعه ادامه آموزش، فایل PDF را دانلود نمائید

توجه : سورس پروژه داخل پوشه Exercises قرار داده شده است.

با توجه به اینکه آموزشهای پایه با قیمت پایین در اختیار کاربر قرار گرفته و درآمد حاصل صرف تامین هزینه های وب سایت و تهیه آموزش های آتی می شود، به اشتراک گذاری این فایل با دیگران خلاف اخلاق خواهد بود.

دانلود نسخه کامل این آموزش به همراه سورس پروژه
تعداد صفحات : ۴۸
حجم : ۴ مگابایت
قیمت : ۱۸ هزار تومان
توجه: صرفا در صورتی از درگاه پشتیبان استفاده کنید که قادر به پرداخت از طریق سبد دانلود نباشید.
افزودن به سبد دانلود درگاه پشتیبان
این مطلب چقدر برایتان مفید بود؟ لطفا امتیاز دهید
3.6/5 - (14 امتیاز)
پرسش‌ها و دیدگاه‌های کاربران
دوره آموزش برنامه نویسی اندروید
دوره آموزش برنامه نویسی اندروید

با دریافت این دوره به تمامی آموزش‌های غیر رایگان و رایگان موجود در وب سایت دسترسی دارید که تخفیفی برای آموزش‌های غیر رایگان نیز درنظر گرفته شده. این پکیج به دو صورت دانلودی و ارسال پستی ارائه می‌گردد.
آموزش‌های اندروید استودیو در دو دسته «پایه» و «تکمیلی» منتشر می‌شوند.
آموزش‌های پایه شامل مباحث اصلی و ضروری و آموزش‌های تکمیلی مطالبی است که می‌بایست در کنار مطالب اصلی بررسی شود.
با خرید این دوره، به تمامی آموزش‌های غیر رایگانی که در آینده منتشر می‌شود نیز به صورت رایگان دسترسی خواهید داشت!

یک دیدگاه بنویسید

پرسش‌های زیر تایید و پاسخ داده نـــخواهند شد:
۱: جزء موارد مطرح شده در صفحات مشکلات و پرسش‌های رایج و بروزرسانی‌های محتوای آموزشی باشد
۲: سوال قبلا توسط کاربران در دیدگاه‌ها مطرح و پاسخ داده شده باشد
۳: پرسش خارج از مبحث آموزشی موجود در این صفحه باشد

  • امین قاضی مرادی گفت:

    سلام استاد
    آموزش به صورت پروژه محور کی در سایت قرار میگیره؟

    • سیدمهدی مطهری گفت:

      سلام. اکثر مباحث فعلی هرکدوم در قالب یک پروژه کوچیک تهیه شدن منتها اگه منظورتون پروژه های کامل هست ان شا الله بعد از اینکه مباحث اصلی تکمیل بشه

  • فرزاد عسکری گفت:

    سلام مهندس/ توی این بخش وقتی ران می کنم چیزی نشون نمی ده و هیچ گونه اروری هم نمی ده/
    https://s4.uupload.ir/files/screenshot_2021-08-27_002421_s3b.png

  • Farnaz گفت:

    سلام باچه متدی میتوان داده های Recycler viewرا به شکل جدول نمایش داد قطعه کدش چی هست

  • ghazal گفت:

    کدها کامل نیستن اصلا داخل اکتیویتی فقط ریسایکلر رو تعریف کردید و هیچ لیستی ساخته نشده و به اداپتر متصل نشده بیچاره دانشجوهایی که با خوندن کد های ناکامل فکر میکنن ریسایکلر چقد سخته

  • mahshid گفت:

    سلام
    من این فایل رو خریدم اما لینک دانلود که برام ایمیل شده میگه شما اجازه دانلود ندارید. لطفا بررسی کنید

  • حسین گفت:

    سلام. موقع نصب cardview و design با خطاهای زیر روبرو میشم. مشکل چیه؟
    Failed to resolve: transition-1.0.0
    Affected Modules: app

    Failed to resolve: cardview-1.0.0
    Affected Modules: app

    Failed to resolve: material-1.0.0
    Affected Modules: app

    Failed to resolve: appcompat-1.2.0
    Affected Modules: app

  • سیدمحمود نواب گفت:

    سلام آقای مطهری عزیز . من ۷ مرداد سوالی از خدمتتون پرسیدم . و امروز ۱۴ مرداد هنوز پاسخی دریافت نکردم . امیدوارم حالتون خوب باشه و خدای نکرده مشکلی براتون پیش نیومده باشه . مشکل من حل شد و نیازی به پاسخ نیست . ارادتمند شما .

    • سیدمهدی مطهری گفت:

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

  • سیدمحمود نواب گفت:

    سلام و عرض ارادت . آقای مطهری عزیزم چون دیدم یکی از دوستان کم لطفی فرمودن باید عرض کنم سایت فارسی زبانی نبوده که من برای آموزش اندروید سر نزده باشم . اگر نگم بهترین باید بگم یکی از بهترین سایتها و پی.دی.افهایی که در حال حاضر برای آموزش اندروید در ایران وجود داره سایت وزین شماست .
    ضمنا سوال داشتم خدمتتون : من مبحث cardView-tow رو خوندم و پیاده کردم تمام source های شما رو هم نگاه کردم ولی خروجی لیست افقی نمیشه . در source شما هم LinearLayout horizontal ندیدم . اما عکسی که در pdf گذاشتین افقیه . اگر راهنمایی بفرمایید ممنون میشم .

  • برنامه نویس گفت:

    باسلام آقای مطهری
    علم شما برای اموزش خیلی ضعیفه و فعلا جای کار دارید
    از ابتدا تا انتها سورستون خطاست-این که کد اجرا بشه بله اما اینکه تا چه حد شی گرا باشه و سرعت پردازش سریعی داشته باشه هم ملاکه-لطفا مخاطبینتون رو به این سورس ها عادت ندید-حلال نیست

    • سیدمهدی مطهری گفت:

      سلام. ممنون از لطف شما. قطعا ادعایی ندارم. البته اینکه میفرمائید از ابتدا تا انتها خطاست، مبالغه چاشنیش شده. میتونید آموزشهای بقیه وب سایتها رو بررسی و مقایسه بفرمائید. و اینکه سعی کردم آموزشها در ساده ترین حالت ممکن تهیه بشه. بعدا در آموزشهای پروژه محور قطعا کدها به اینصورت نخواهد بود.
      موفق و پیروز باشید

  • مناعیوضی گفت:

    سلام من این آموزش و خریدم حالا میخوام بدونم میشه برا ریسایکل ویو زیر آیتم تعریف کرد؟منظورم اینکه مثلا۴ تا لیست دارم به اسم علم و سرگرمی و ورزش و هنر حالا مثلا بزنی رو ورزش ۳ تاآیتم بیادمثلا فوتبال والیبال هندبال بزنی روفوتبال بره یه اکتیویتی دیگه.ممنون میشم زودجواب بدید

  • یزدخواستی گفت:

    سلام روی کتابخانه cardview خطا می دهد مشکل چیست لطفا راهنمائی کنید:
    dependencies {
    implementation fileTree(include: [‘*.jar’], dir: ‘libs’)
    testImplementation ‘junit:junit:4.12’
    implementation ‘com.android.support.constraint:constraint-layout:1.1.2’
    implementation ‘com.squareup.okhttp3:okhttp:3.4.1’
    implementation ‘com.alirezaafkar:sundatepicker:2.0.4’
    implementation ‘com.mohamadamin:persianmaterialdatetimepicker:1.2.1’
    implementation ‘com.github.bumptech.glide:glide:3.7.0’
    implementation ‘org.apache.httpcomponents:httpclient-android:4.3.5.1’
    implementation ‘com.bignerdranch.android:recyclerview-multiselect:0.2’
    implementation ‘com.android.support:cardview-v7:28.0.0’
    implementation ‘com.flaviofaria:kenburnsview:1.0.7’
    implementation ‘com.google.android.gms:play-services-location:11.0.1’
    implementation ‘com.squareup.retrofit2:retrofit:2.4.0’
    implementation ‘com.squareup.retrofit2:converter-gson:2.4.0’

    }

  • ali گفت:

    پی دی افی که آماده کردید خیلی خیلی افتضاح و بد توضیح داده شده بود همچنین فرمت نمایش کد ها با پس زمینه سیاه خیلی آزار دهنده و خیلی آدم را برای خواندن ادامه متن اذیت میکنه
    همین مدلی که توی سایت هست خیلی خیلی خیلی بهتره از پی دی اف

    • سیدمهدی مطهری گفت:

      ممنون از انتقاد شما. در مطالب جدید پس زمینه کدها از تیره به روشن تغییر پیدا کرده که اگه آخرین مطلب رو دانلود بفرمایید (رایگان هست) این تغییر رو مشاهده میکنید. موفق و پیروز باشید

  • احمدنژاد گفت:

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

  • حسن نقی زاده گفت:

    سلام بزرگوار ، خسته نباشید
    خواهش می کنم ازتون رفع ارور زیر رو یاد بدین
    Failed to resolve: recyclerview-v7
    قبول نمی کنه هرکاری می کنم.

  • shirinvtni گفت:

    سلام خسته نباشید
    واقعا ممنون از آموزش عالی و خوبتون …
    من خیلی دنبال آموزش کاردویو و ریسایکلرویو باهم میگشتم اما واقعا تکراری بودن و خوب توضیح ندادن..
    اما آموزش شما فوق العاده بود.

  • صلاح الدین گفت:

    سلام و خسته نباشید کتابخانه که
    implementation ‘com.android.support:recyclerview-v7:28.0.0’ باشد هنگام اوررایت کردن آپدیت شده میشه برای نوشتن متد یه اموزش بزارین

  • سید آرین حسینی گفت:

    با سلام و عرض ادب

    خواستم بدونم این آموزش به طوری هست که کاربر بتونه یک پست جدید(مانند برنامه دیوار و شیپور) ایجاد کنه و دیگران با متصل شدن به اینترنت بتونن ، پست اون رو ببینن و بهش جواب بدن ، لطفا راهنمایی کنید

    تشکر…

  • ناشناس گفت:

    سلام بزرگوار…
    موقع وارد کردن library یک گزینه به نام install repository می آید library recyclerview-v7 is not installed. Install repository? و بعد yes را می زنم که شروع به دانلود می کند ولی بعد از مدتی یک ارور می دهد که All packages are not available for download!
    The following packages are not available:
    -package id extras;android;m2repository چرا این ارور می آید؟این ارور موقع دانلود library cardview هم می آید،چرا دانلود فعال نیست؟چگونه باید این ارور را رفع کنم؟خیلی ممنون می شوم اگر که پاسخ دهید…با تشکر…

  • آزاد گفت:

    سلام
    شرمنده من آموزش recycler view رو به جای سبد خرید از لینک بالایی خریداری کردن. ممنون می شم اگر آموزش رو برام ارسال بفرمایید.

  • shahram mokhbery گفت:

    سلام
    ممنون بابت آموزش خوبتون
    اگر آموزشاتون پروژه محور باشه خیلی بهتر و جذابتر میشه
    لطفا آموزش دیتا بیس با mysql و php بزارید
    و سطح پیشرفته تر
    با تشکر

  • عرفان گفت:

    سلام ،
    درقسمت :
    public class MyViewHolder extends RecyclerView.ViewHolder {}
    ارور میده میگه :
    there is no default constructor available in “android.support.v7.widget.RecyclerView.ViewHolder”
    لطفا راهنماییم کنید

  • Mohammad گفت:

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

  • M_A گفت:

    سلام خیلی ممنون از اموزش عالی تون .
    من همه اینکارارو انجام دادم ولی وقتی اپو اجرا کردم لیستی که درست شده خیلی سنگین اسکرول میشه میخاستم بدونم چرا و راهی هس که بشه درستش کرد؟

  • hamid گفت:

    سلام استاد من همین اموزشتون رو خریداری کردم و دقیقا طبق همین مثالتون پیش رفتم ولی موقع خروجی کرش کرد
    میشه لطفا یه بار دیگه کداشو تست کنید خطاشم تو قسمت آیتم اداپتر بود ..لطفا رسیدگی کنید

  • hamid گفت:

    سلام
    ممنون از سایت بسیار خوبتون
    میخاستم بگم میشه آموزشا رو درقالب فیلم بگید یا درقالب یه پروژه پکیج باشه که بتونیم راحتر یاد بگیریم
    مثلا اگه الان من بخام اطلاعات دیتابیسو رو ی ریساکل نشون بدم چجوریه ؟؟
    بازم تشکر از سایت خوبتون