سلام به همه دوستان عزیز

از سری ویدئوهای آموزشی متریال دیزان و UI در اندروید در خدمتتون هستیم.

rahmani-recyclerview

RecyclerView

RecyclerView یک ویو جدید معرفی شده توسط گوگل می باشد. که جایگزین مناسبی برای ListView  و GridView می باشد.

از مزایای آن می توان به:

۱- سرعت بالای لود شدن آیتم ها نسبت به لیست ویو

۲- اشغال مقدار رم کمتر از گوشی کاربر نسبت به لیست ویو

۳- قابلیت نمایش در هر دو حالت list و grid

۴- دارای انیمیشن های پیش فرض برای اضافه شدن یا حذف شدن آیتم ها

و… بسیاری قابلیت جذاب دیگر

 

توی این ۳ ویدئو کار با ریسایکلر ویو رو به صورت کامل به شما دوستان عزیز آموزش میدیم.

با ما همراه باشید…

دانلود رایگان(قسمت ۲۳) آموزش RecyclerView بخش اول

دانلود رایگان(قسمت ۲۴) آموزش RecyclerView بخش دوم

رمز فایل ها : www.esfandune.ir

قسمت قبلی

فهرست تمامی قسمت ها

قسمت بعدی

لینک کوتاه شده مطلب: http://www.esfandune.ir/61D9j

پسور فایل ها: esfandune.ir یا www.esfandune.ir می باشد

درباره محمد رحمانی

من" محمد رحمانی" فارغ التحصیل مهندسی برق قدرت هستم. هم اکنون به برنامه نویسی اندروید به زبان جاوا مشغولم ... امیدوارم این آموزش ها برای شما دوستان عزیز مفید واقع بشوند...

ما را دنبال کنید:


آموزش های پیشنهادی سایت (نمایش همه):


۷۵ نظر

  • سعید گفت:

    با تشکر از آموزشهای خوبتان، من تا قسمت ۲۰ رو دیدم و خیلی خوب بوده، یه سوال داشتم، توی آندروید چطور میشه از Color Picker استفاده کرد. منظورم اینه قسمت تنظیمات باشه یه پالت یا قالب رنگ بیاد و با انتخاب اون رنگ نوشته مثلاً عوض بشه.

  • حمید گفت:

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

    • محمد رحمانی گفت:

      توی این سه قسمت شما به صورت کامل با پیاده سازی ریسایکلر ویو آشنا میشید و برای آیتم ها هم رویداد آنکلیک در نظر میگیرم
      اما من منظور شما رو از انتخاب آیتم متوجه نشدم!

  • امیرحسین شمسی گفت:

    من قسمت ۲۵ را از این بخش خریداری کردم و یه رسید با لینک قسمت ۲۵ برای من ارسال شد اما اون لینک به من اجازه دانلود نمیده و پیام شما اجازه دسترسی ندارید رو برام مبفرسته لطفا بررسی منید

  • محمدرضا گفت:

    سلام، با تشکر از آموزش های خوبتون .
    میخواستم بدونم آیا برای آموزش های متریال دیزانتون تخفیف در نظر نمیگیرن ؟ امکان خرید یک جا با یک قیمت مناسب تر ؟

  • رضا گفت:

    با سلام
    آیا نحوه نمایش ریسایکلر ویو بصورت grid هم آموزش داده شده ؟؟

    • محمد رحمانی گفت:

      سلام
      اینجا ما آیتم هارو به صورت خطی نشون دادیم
      اما برای نشون دادن به صورت grid کافیه یک خط از کدهارو تغییر بدید که توضیح داده شده
      و اینکه لایه ی آیتم هاتون رو متناسب با نوع نمایش تغییر بدید

  • رضا گفت:

    سلام. چطوری میتونم کل محتوای اکتیویتی رو راستچین کنم ؟ layoutDirection فایده نداره چون تو اندروید پایین جواب نمیده . تو اکتیوتی تب هم دارم

  • نوید گفت:

    سلام و خسته نباشید، در فیلم آموزشی آیتم ها رو از دیتابیس فراخوانی میکنید یا نه ؟

  • aminda گفت:

    سلام جناب رحمانی
    خیلی ممنون از آموزش های خوب متریالتون !
    ایشاله با قدرت بیشتری ادامه بدین
    اگر میشه یه آموزش کامل کار با تب ها با استفاده از فرگمنت رو آموزش بدین

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

    واقعا عالیه.
    لطفا سریع تر بهروزرسانی کنید و مطالب جدید بگذارید. من هرروز سر میزنم به سایت و منتظر ویدئو جلسات بعد هستم. ممنون.

    • محمد رحمانی گفت:

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

  • JAVAD گفت:

    لطفا سرعت آموزش هاتون رو بیشتر کنید

  • mahdi گفت:

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

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

    چند قسمت آخر صدا ضعیف است.

  • amir گفت:

    سلام
    از آموزش های خوبتون تشکر میکنم.
    ببخشید من این آموزش هارو خریدم امکانش هست سورس این آموزش هارو هم قرار بدید؟

  • محمدرضا گفت:

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

    • محمد رحمانی گفت:

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

  • جواد گفت:

    سلام ممنون از آموزش خوبتون
    می خواستم بدونم چه طور می تونم به جای اینکه رویداد omclick رو تو recycleradapter تعریف کنم تو قسمت mainactivity تعریف کنم

    • محمد رحمانی گفت:

      سلام
      ممنون
      اصلاچرا باید همچین جایی همچین کاری بکنید؟!

      • جواد گفت:

        سلام
        برای اینکه توی این دکمه خیلی کارا میخام انجام بدم که اونجا انجام پذیر نیست
        به فرض مثال میخام یک دیالوگ بهم نشون بده که اصلا کلاس دیالوگ بهم ارور میده
        حالا اگر راهی داره لطفا راهنماییم کنید
        ممنون

        • محمد رحمانی گفت:

          هر کاری بخوانید انجام بدید امکان‌پذیر
          برای استفاده از دیالوگ کافیه context رو به آداپتر پاس بدید
          و توی متد سازنده اداپتر تون رو بگیرید و استفاده‌کنید

  • محسن گفت:

    سلام
    من این دوره رو خریدم ولی نصفشو دانلود کردم و مرورگرم ناگهان بسته شد
    حالا امکانش هست لینکشو برام بفرستید

  • amir گفت:

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

  • sadena گفت:

    سلام
    من دقیقا طبق آموزشهاتون عمل می کنم ولی وقتی برنامه رو اجرا می کنم برنامم crash می کنه. باید چی کار کنم؟

  • Taha گفت:

    سلام متاسفانه ریسایکلر ویو در اندروید ۵ به پایین اجرا نمیشه اگه میشه کمک کنید….

  • zahra گفت:

    سلام
    ممنون از اموزش خوبتون
    شما داخل ویدئو اخر قسمت onclick رو یه toast گذاشتید. من میخوام توی این قسمت عین برنامه های خبرخوان که وقتی روی ایتم کلیک میشه صفحه خبر میاد. اینم وقتی روی لیست کلیک میشه صفحه توضیحاتش رو نشون بده. از intent برای رفتن به اکتیویتی جدید استفاده کردم ولی خطا میده.textview مربوط به توضیحات رو هم که اتفاده کردم خطا داد. ممنون میشم راهنماییم کنید

    • محمد رحمانی گفت:

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

  • م.دشتی زاده گفت:

    سلام
    من برنامه رو گام به گام با شما پیشرفتم ولی توی RecyclerAdapter.java وقتی زیر کلاس contactViewHolder رو ایجاد کردم از کد super(itemView); خطا میگیره و به همین دلیل هم اجرا نمیشه!
    میشه لطفا راهنمایی کنید باید چه چیزی رو تعریف کنیم که مشکل برطرف شه؟
    ممنون

  • آرش ایزدپناه گفت:

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

  • مصی گفت:

    سلام و خسته نباشد
    ببخشین من یجایی تو ریسایکلر گیر کردم
    دقیقا طبق اموزش های شما پیش رفتم و جای کلیک کردن روی لیست ریسایکلر شما توست گذاشتین
    حالا من موندم که چطور باید به تمام لیستام دستور کلیک بدم اونجا
    کد تو اداپتر:
    public class RecyclerAdapter extends RecyclerView.Adapter {

    private Context context;
    private List lists;

    public RecyclerAdapter(Context context, List lists) {
    this.lists = lists;
    this.context = context;
    }

    @Override
    public listViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View listview = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_item, parent, false);
    return new listViewHolder(listview);
    }

    @Override
    public void onBindViewHolder(listViewHolder holder, final int position) {
    final List_Rec list_rec = lists.get(position);
    holder.pic.setImageResource(list_rec.pic);
    holder.txt.setText(list_rec.name);
    holder.linearLayout.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {

    Intent intent = new Intent(context, activity2.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(intent);

    }
    });
    }

    @Override
    public int getItemCount() {
    return lists.size();
    }

    public class listViewHolder extends RecyclerView.ViewHolder {

    public ImageView pic;
    public TextView txt;
    public LinearLayout linearLayout;

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

    pic = (ImageView) itemView.findViewById(R.id.imag_item);
    txt = (TextView) itemView.findViewById(R.id.name);
    linearLayout = (LinearLayout) itemView.findViewById(R.id.mm);
    }
    }
    }

    کمکم کنید که کجارو باید درست کنم خواهش میکنمممممممممممممم

  • raha گفت:

    سلام
    اگر به طور جداگانه و دقیق محتوی هر قسمت رو هم بگید ممنون میشیم. (هرقسمت جدا)

  • alireza گفت:

    chetori masalan har kodom ro be ye safhe jodagane intent konimm???
    codesho mikham

    mamnun az zzahamate besyar

  • Aida گفت:

    سلام ، وقت بخیر
    من توی activity اولم یه لایه verticalدارم که بالاش یه بنر ایجاد کردم و زیرش یه متنی گذاشتم وبعدش یه recyclerView و کارتهام رو به صورت گرید قرار دادم… و در نهایت همشون رو تو تگ اسکرول ویو قرار دادم
    اما در هنگام اجرای برنامه … از جایی نشون میده که کارت ها شروع میشن … بالای صفحه رو نمایش نمیده … توی گرید و vertical ، به این صورت نمایش میده … در horizontal مشکلی نیست و درست نمایش میده ، به نظر شما دلیلش چیه؟
    با تشکر از آموزش های خوبتون

    • محمد رحمانی گفت:

      با سلام
      بندن نمیدونم که شما به چه صورت لایه بندی رو انجام دادید
      خود ریسایکلرویو نیازی به اسکرول نداره
      اگر میخواید زیر همدیگه قرار بگیرن خیلی راحت از linearLayout استفاده کنید

  • امیر حنیفه گفت:

    با سلام خدمت آقا محمد

    خسته نباشید.

    آموزش خیلی عالیه من خریدمش و راضیم.

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

    ممنون از پاسخ گویی شما.

  • ناشناس گفت:

    آموزش کامل و بدون نقص بود، ولی من یه مشکلی دارم وقتی از switch برای onClick هر آیتم استفاده کردم ، درست کار کرد و مشکلی نداشت اما وقتی می خواهم به اکتیویتی دیگه برم مشکل Intent و StartActivity رو دارم لطفا کمکم کنید

  • علیرضا گفت:

    استاد چجوری میشه on item click براش نوشت؟
    میخوام روی هر ایتم کار مختلفی انجام بده

    • محمد رحمانی گفت:

      سلام
      همونطور که ما از toast استفاده کردم شما هم با استفاده از دستورهای شرطی میتونید برای هر آیتم رویداد مورد نظرتونو قرار بدید.

  • سید سعید موسوی گفت:

    سلام من اموزش هاتون دانلود کردم ولی اجرا نمیشه و force close میده .اگه امکانش هست یک ایمیل بهم بدید که پروژه رو براتون بفرستم مشکل از کجاس

  • Rohollah گفت:

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

  • MarAnd گفت:

    سلام ،
    من وقتی که میخام کتابخانه ی مربوط به circleimageview رو اضافه کنم طبق اموزش های شما ، با اینکه فیلترشکن روشن هست ولی اررور میده و اضافه نمیشه. چی کار باید بکنم ؟ ایا ربطی به میینیمم sdk ویا target و این ها داره ؟؟

  • میلاد شقاقی گفت:

    با سلام و تبریک ایام نوروز و آرزوی شادکامی

    و با تشکر از زحماتتان، بنده قسمت متریال دیزاین و recycelview را خریداری کردم و با آموزشها ژیش رفتم فقط بسیار به اینکه روی هر گزینه recycelview که کلیک میکنم
    صفحه جدیدی باز شود احتیاج دارم که دوست عزیز rohollah هم به درستی این مطلب را به جا آوردند لطفا راهنمایی بفرمایید.

  • میلاد شقاقی گفت:

    برادر پیامم رو پاک کردی لطفا بفرما یه مثال که به جای Toast چطوری هر چیزی خواستیم بنویسیم کدش رو لطفا بزار
    که متوجه بشیم چطور به یه صفحه دیگه وصلش کنیم

  • meisam گفت:

    سلام خسته نباشید ممنون از آموزش خوبتون من سه قسمت را هم نگاه کردم در قسمت سوم که با Toast پیام میدید ولی کاش با intent هم آموزش میدادین الان من هرکاری میکنیم با Intent نمیتونم درست کنم که کدوم ایتم کیلیک کرد بره به اکتویتی دیگر
    در این مورد لطفا راهنمایی کنید ممنون از شما

  • سعید حسینی گفت:

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

  • سید علی گفت:

    سلام خسته نباشید
    من می خواستم به هر لایه یک لینک جدا بدم
    چطور میتونم؟

  • حامد گفت:

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

    • abbasalim گفت:

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

  • حامد گفت:

    البته الان مزایایی که توی عنوان این مطلب هست رو دیدم ولی اونچه که شما توضیح دادید با لیست ویو هم قابل انجام هستش . کاش آموزشتون رو بیشتر روی مزایای recyclerView نسبت به listView متمرکز میکردید

  • حیدری گفت:

    سلام میتونید راهنمایی کنید که این خطا واسه چیه ؟؟؟

    E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.delijanmarket.behnam.andromarket, PID: 1578
    android.view.InflateException: Binary XML file line #14: Binary XML file line #14: Error inflating class TextView
    Caused by: android.view.InflateException: Binary XML file line #14: Error inflating class TextView
    Caused by: java.lang.UnsupportedOperationException: Can’t convert value at index 14 to dimension: type=0x6
    at android.content.res.TypedArray.getDimensionPixelSize(TypedArray.java:730)
    at android.view.View.(View.java:4733)
    at android.widget.TextView.(TextView.java:824)
    at android.widget.TextView.(TextView.java:818)
    at android.support.v7.widget.AppCompatTextView.(AppCompatTextView.java:76)
    at android.support.v7.widget.AppCompatTextView.(AppCompatTextView.java:72)
    at android.support.v7.app.AppCompatViewInflater.createTextView(AppCompatViewInflater.java:176)
    at android.support.v7.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:101)
    at android.support.v7.app.AppCompatDelegateImplV9.createView(AppCompatDelegateImplV9.java:1035)
    at android.support.v7.app.AppCompatDelegateImplV9.onCreateView(AppCompatDelegateImplV9.java:1092)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:772)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:863)
    at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
    at com.delijanmarket.behnam.andromarket.PostsAdapter.onCreateViewHolder(PostsAdapter.java:27)
    at com.delijanmarket.behnam.andromarket.PostsAdapter.onCreateViewHolder(PostsAdapter.java:14)
    at android.support.v7.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:6685)
    at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5869)
    at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5752)
    at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5748)
    at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2232)
    at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1559)
    at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1519)
    at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:614)
    at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3812)
    at android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.java:3225)
    at android.view.View.measure(View.java:21998)
    at android.support.constraint.ConstraintLayout.internalMeasureChildren(ConstraintLayout.java:1210)
    at android.support.constraint.ConstraintLayout.onMeasure(ConstraintLayout.java:1550)
    at android.view.View.measure(View.java:21998)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6580)
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
    at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:141)
    at android.view.View.measure(View.java:21998)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6580)
    at android.support.v7.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:400)
    at android.view.View.measure(View.java:21998)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6580)
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
    at android.view.View.measure(View.java:21998)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6580)
    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1514)
    at android.widget.LinearLayout.measureVertical(LinearLayout.java:806)
    at android.widget.LinearLayout.onMeasure(LinearLayout.java:685)
    at android.view.View.measure(View.java:21998)
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6580)
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
    at com.android.internal.policy.DecorView.onMeasure(DecorView.java:721)
    at android.view.View.measure(View.java:21998)
    at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2410)
    at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1498)
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1751)
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1386)
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6733)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:911)
    at android.view.Choreographer.doCallbacks(Choreographer.java:723)
    at android.view.Choreographer.doFrame(Choreographer.java:658)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897)
    at android.os.Handler.handleCallback(Handler.java:789)
    at android.os.Handler.dispatchMessage(Handler.java:98)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6541)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

نظر خود را بیان کنید

بسته آموزشی زمستانه فارسی اندروید
تخفیف نورورزی
تخفیف سورس اینستا
تخفیف سورس اینستا
تخفیف سورس اینستا
تخفیف سورس اینستا
تخفیف سورس اینستا
تخفیف سورس اینستا
بسته آموزشی زمستانه فارسی اندروید
آموزش برنامه نویسی اندروید با کاتلین