<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های محمدرضا فکری</title>
        <link>https://virgool.io/feed/@fekri86114</link>
        <description>عاشق دنیای تکنولوژی | در حال تبدیل رویا ها به واقعیت ...</description>
        <language>fa</language>
        <pubDate>2026-06-10 15:25:29</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/1255559/avatar/d8K0fv.jpg?height=120&amp;width=120</url>
            <title>محمدرضا فکری</title>
            <link>https://virgool.io/@fekri86114</link>
        </image>

                    <item>
                <title>رتروفیت در اندروید | Retrofit in Android</title>
                <link>https://virgool.io/@fekri86114/%D8%B1%D8%AA%D8%B1%D9%88%D9%81%DB%8C%D8%AA-%D8%AF%D8%B1-%D8%A7%D9%86%D8%AF%D8%B1%D9%88%DB%8C%D8%AF-retrofit-in-android-yiva0cmd5ncs</link>
                <description>سلام سلام. امیدوارم حالتا عالی باشد.در دنیای توسعه برنامه اندروید، ارتباطات شبکه کارآمد جنبه مهمی برای ارائه یک تجربه کاربری یکپارچه است. Retrofit، یک کتابخانه قدرتمند که توسط Square معرفی شده است، شیوه تعامل توسعه دهندگان با RESTful API را متحول کرده است. Retrofit فرآیند ارسال درخواست‌های شبکه، رسیدگی به پاسخ‌ها و تجزیه داده‌ها را ساده می‌کند و به توسعه‌دهندگان اجازه می‌دهد تا روی ساخت برنامه‌های قوی و غنی از ویژگی‌ها تمرکز کنند. در این مقاله به بررسی مزایای رتروفیت می پردازیم.این مقاله صرفا مکمل ویدویی است که در شبکه اجتماعی قرار است به اشتراک گذاشته شود.Retrofit 2خب، یکمی بیشتر از رتروفیت بشنویم:به گفته سایت CodePath :Retrofit is a type-safe REST client for Android, Java and Kotlin developed by Square.  The library provides a powerful framework for authenticating and  interacting with APIs and sending network requests with OkHttp.ترجمه:رتروفیت یک کلاینت REST ایمن برای اندروید، جاوا و کاتلین است که توسط شرکت Square توسعه یافته است.این کتابخانه یک چارچوب قدرتمند برای احراز هویت و تعامل با API ها و ارسال درخواست های شبکه با OkHttp فراهم می کند.و تعریفی از ChatGPT بشنویم:Retrofit2 is a popular networking library for Android app development that simplifies the process of making network requests and handling API responses. It provides a high-level, declarative interface for interacting with RESTful APIs.Built on top of the OkHttp library, Retrofit2 offers a robust set of features and utilities for handling HTTP requests and responses. It streamlines the process of making network calls by abstracting away many of the complexities involved in network communication.With Retrofit2, you can define an interface that represents the API endpoints, specify the HTTP methods (such as GET, POST, PUT, DELETE), and define the request parameters and response types using annotations. It also supports dynamic URL manipulation, request headers customization, and request/response interception.Retrofit2 simplifies data parsing by automatically converting JSON or XML responses into model objects using libraries like Gson or Jackson. It allows you to define custom converters for handling other data formats if needed.The library also provides support for various authentication mechanisms, such as OAuth, and allows easy integration with RxJava for reactive programming.Overall, Retrofit2 is highly regarded for its simplicity, flexibility, and efficiency in handling network operations, making it a go-to choice for many Android developers when working with web APIs.ترجمه:رتروفیت2 یک کتابخانه شبکه محبوب برای توسعه برنامه اندروید است که فرآیند ایجاد درخواست های شبکه و مدیریت پاسخ های API را ساده می کند. این یک رابط سطح بالا و اعلامی برای تعامل با API های RESTful فراهم می کند.رتروفیت2 که در بالای کتابخانه OkHttp ساخته شده است، مجموعه ای قوی از ویژگی ها و ابزارهای کمکی را برای رسیدگی به درخواست ها و پاسخ های HTTP ارائه می دهد. با حذف بسیاری از پیچیدگی های موجود در ارتباطات شبکه، فرآیند برقراری تماس های شبکه را ساده می کند.می توانید رابطی را تعریف کنید که نشان دهنده نقاط پایانی API باشد، روش های HTTP (مانند GET، POST، PUT، DELETE) را مشخص کنید و پارامترهای درخواست و انواع پاسخ را با استفاده از حاشیه نویسی تعریف کنید. همچنین از دستکاری URL پویا، سفارشی سازی هدر درخواست و رهگیری درخواست/پاسخ پشتیبانی می کند.تجزیه داده ها را با تبدیل خودکار پاسخ های JSON یا XML به اشیاء مدل با استفاده از کتابخانه هایی مانند Gson یا Jackson ساده می کند. این به شما امکان می دهد در صورت نیاز مبدل های سفارشی را برای مدیریت سایر فرمت های داده تعریف کنید.این کتابخانه همچنین از مکانیزم های احراز هویت مختلف مانند OAuth پشتیبانی می کند و امکان ادغام آسان با RxJava را برای برنامه نویسی واکنشی فراهم می کند.به طور کلی، Retrofit2 به دلیل سادگی، انعطاف‌پذیری و کارایی آن در مدیریت عملیات شبکه بسیار مورد توجه قرار می‌گیرد و آن را به انتخابی مناسب برای بسیاری از توسعه‌دهندگان اندروید هنگام کار با APIهای وب تبدیل می‌کند.Retrofitبیاید به قابلیت های رتروفیت بپردازیم:1. پاسخ های ایمن:رتروفیت پاسخ های API را از طریق قابلیت های deserialization قدرتمند خود به object های جاوا تبدیل می کند. از فرمت های داده های مختلف مانند xml ،json و ... پشتیبانی می کند و با استفاده از کتابخانه های serialization محبوب مانند Jackson و Gson تبدیل خودکار به object جاوا را انجام می دهد.2. سفارش سازی درخواست (Request Customization):رتروفیت انعطاف پذیری را در پیکربندی درخواست های شبکه فراهم می کند. این امکان customize کردن header ها، پارامتر های query، بدنه های request و مکانیسم های احراز هویت را فراهم می کند. و توسعه دهندگان را قادر می سازد تا درخواست ها را با الزامات API خاص تطبیق دهند.3. رهگیر ها (Interceptors):رتروفیت از رهگیر ها پشتیبانی می کند که می توانند برای تغییر در request ها و response ها در زمان اجرا استفاده بشوند. Interceptor ها برای کار هایی مانند ورود به سیستم، دستکاری header و مدریت token های احراض هویت مفید هستند.4.مدیریت خطا (Error Handling):رتروفیت مدیریت خطا را با ارائه گزینه هایی برای رسیدگی به انواع مختلف خطاها، مانند: خرابی شبکه (Netwrok failures)، مهلت زمانی (Timeouts)، یا پاسخ های اشتباه (Error Response)ساده می کند و از Callback یا RxJava برای مدیریت خطاهای asynchronous (غیر همزمان) استفاده می کند.نحوه کار رتروفیت با کاتلیندر آخر از شما متشکرم که تا اینجا اومدین. ویدیو مربوط به راه اندازی رتروفیت و کار با RxJava و ... در شبکه های اجتماعی (مانند یوتیوب و ...) بارگذاری خواهم کرد و با شما در اشتراک ی گمذارم.البته قبل رفتن، ی چیزی رو منشن کنم: من تو گیتهاب فعالیت میکنم و شما میتونید گیتهاب من رو چک کنید و اگه تازه وارد دنیای اندروید شدین (مثل من) میتونید از منابعی که تو گیتهاب گذاشتم استفاده کنید و حال کنین!و خوشحال میشم با من نظرتونو در اشتراک بذارین.محمدرضا فکری.</description>
                <category>محمدرضا فکری</category>
                <author>محمدرضا فکری</author>
                <pubDate>Tue, 20 Jun 2023 13:34:27 +0330</pubDate>
            </item>
                    <item>
                <title>ریسایکلرویو در اندروید کاتلین | RecyclerView in Android Kotlin</title>
                <link>https://virgool.io/@fekri86114/%D8%B1%DB%8C%D8%B3%D8%A7%DB%8C%DA%A9%D9%84%D8%B1%D9%88%DB%8C%D9%88-%D8%AF%D8%B1-%D8%A7%D9%86%D8%AF%D8%B1%D9%88%DB%8C%D8%AF-%DA%A9%D8%A7%D8%AA%D9%84%DB%8C%D9%86-recyclerview-in-android-kotlin-ylfpusbz0ehx</link>
                <description>سلام!امیدوارم حالتون عالی باشه!تو این مقاله بیاین باهم به ساختار ساده و اولیه ریسایکلرویو بپردازیم! و بعدا یکمی حرفه ای تر بشیم!خب، اینو بگم که اگه اولتونه، ممکنه براتون ریسایکلرویو سخت باشه ولی با تمرین و تکرار خدای ریسایکلرویو میشین! این از من قول!شروع کنیم..آقا، این RecylerView چیه؟به تعریف developers :RecyclerView is the ViewGroup that contains the views corresponding to your data. It&#x27;s a view itself, so you add RecyclerView to your layout the way you would add any other UI element. Each individual element in the list is defined by a view holder object.ترجمه: ریسایکلرویو(RecyclerView) ویو گروپی(ViewGroup) است که که حاوی نماهای مربوط به داده های شما است. این خودش ی ویو هستش، بنابر این RecyclerView را طوری که هر عنصر رابط کاربری(UI) را اضافه می کنید، به طرح بندی خود اضافه می کنید. هر عنصر جداگانه در لیست توسط یک شی نگهدارنده view تعریف می شود.خب، بیاین برای خوب درک کردنش با ی مثال بریم جلو:&quot;قراره ی چندتا دیتا رو که مقدارشونو نمیدونیم، از سرور نشون بدیم&quot;من میگم بیایم با Postman دیتا ها رو بخونیم و دستی بیایم یکی یکی با LinearLayout و CardView و ... جمعش کنیم!اوپس!! مگه این ممکنه؟! نه! خیلی طولانی و خسته کننده و اصلا غیر ممکنه، چندتا دیتا رو میتونی نشون بدی؟اینجاس که ریسایکلرویو به کمک ما میاد و از دستمون میگیره و میگه محمدرضا یکمی منطقی فکر کن پسر!و بعد میگه: ببین، مگه نمیخوای دیتا های زیاد رو زیر هم نشون بدی؟ من اینجام دیگه! من میتونم برات زیر هم و کنار هم نشون بدم! هر چقدر که آیتم بهم بدی نشون میدم! فقط ی چندتا شرط دارم :-)اپ مورد نظرمون تو این مقالهخب، اوکی، گرفتیم چی شد! ریسایکلرویو خیلی ویو خوبی هستش و اما فرصت طلب!! ی چندتا شرط داره :-)بیاین ببینیم چیه؟تعریف کردن در فایل xmlتعریف کردن ویو برای ریسایکلرویو (آیتم های ما چطوری نشون داده بشن؟)ساخت یک دیتا کلاس (DataClass)ساحت ادپتر / آداپتر (Adapter)توجه داشته باشیم که همه ویو هایی که قراره روشون عملیاتی انجام بشه (مثل اعمال عکس، کلیک شدن و ...) باید id داشته باشندبیاین با ی مثال عملی ادامه بدیم. میخواهیم اسم چند  مکانی رو با عکس نشون بدیم. بیاین این 4 خان رو باهم بریم جلو، گفتیم اولین کار تعریف کردن در فایل xml که می خواهید استفاده کنیدخان اول: ساختن ویو در فایل مورد نظر (من خودم برای مثال در activity_main.xml ساختم)&lt;androidx.appcompat.widget.LinearLayoutCompat xmlns:android=&amp;quothttp://schemas.android.com/apk/res/android&amp;quot
    xmlns:tools=&amp;quothttp://schemas.android.com/tools&amp;quot
    android:layout_width=&amp;quotmatch_parent&amp;quot
    android:layout_height=&amp;quotmatch_parent&amp;quot
    android:gravity=&amp;quotcenter&amp;quot
    android:orientation=&amp;quotvertical&amp;quot
    android:padding=&amp;quot8dp&amp;quot
    tools:context=&amp;quot.MainActivity&amp;quot&gt;

        &lt;androidx.recyclerview.widget.RecyclerView
             android:id=&amp;quot@+id/recycler__main&amp;quot
            android:layout_width=&amp;quotmatch_parent&amp;quot
            android:layout_height=&amp;quotmatch_parent&amp;quot
            android:paddingBottom=&amp;quot8dp&amp;quot
            tools:listitem=&amp;quot@layout/item_recycler&amp;quot /&gt;

&lt;/androidx.appcompat.widget.LinearLayoutCompat&gt;به کد بالا خوب دقت کن، ببین ما ی چیزی داریم به نام listitem که میاد ویوی که میخواهیم توش دیتاهامونو ست کنیم رو برای تست نشون میده. چرا تست؟ خب، چون از tools میاد.دقت کنید، من padding و اینا رو خودم دادم، شما هم میتونید تغییراتی رو اضافه کنید و براخودتون ی چیز دیگه بسازین.خان دوم: ساختن آیتم ویو (item_view.xml)(این فایل میگه داده های ما چطوری نشون داده بشن!)یک فایل با نام item_recycler بسازین:&lt;?xml version=&amp;quot1.0&amp;quot encoding=&amp;quotutf-8&amp;quot?&gt;
&lt;com.google.android.material.card.MaterialCardView xmlns:android=&amp;quothttp://schemas.android.com/apk/res/android&amp;quot
    xmlns:app=&amp;quothttp://schemas.android.com/apk/res-auto&amp;quot
    xmlns:tools=&amp;quothttp://schemas.android.com/tools&amp;quot
    android:layout_width=&amp;quotmatch_parent&amp;quot
    android:layout_height=&amp;quotwrap_content&amp;quot
    android:layout_marginStart=&amp;quot4dp&amp;quot
    android:layout_marginTop=&amp;quot8dp&amp;quot
    android:layout_marginEnd=&amp;quot4dp&amp;quot
    android:layout_marginBottom=&amp;quot2dp&amp;quot
    app:cardCornerRadius=&amp;quot8dp&amp;quot
    app:strokeColor=&amp;quot@color/gray_light&amp;quot
    app:strokeWidth=&amp;quot2dp&amp;quot
    app:cardElevation=&amp;quot0dp&amp;quot&gt;

    &lt;androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width=&amp;quotmatch_parent&amp;quot
        android:layout_height=&amp;quotwrap_content&amp;quot
        android:padding=&amp;quot16dp&amp;quot&gt;

        &lt;androidx.appcompat.widget.AppCompatImageView
            android:id=&amp;quot@+id/img_show_nature&amp;quot
            android:layout_width=&amp;quotmatch_parent&amp;quot
            android:scaleType=&amp;quotcenterCrop&amp;quot
            android:padding=&amp;quot8dp&amp;quot
            android:layout_height=&amp;quotwrap_content&amp;quot
            app:layout_constraintEnd_toEndOf=&amp;quotparent&amp;quot
            app:layout_constraintStart_toStartOf=&amp;quotparent&amp;quot
            app:layout_constraintTop_toTopOf=&amp;quotparent&amp;quot
            tools:srcCompat=&amp;quot@drawable/ic_launcher_foreground&amp;quot /&gt;

        &lt;androidx.appcompat.widget.AppCompatTextView
            android:id=&amp;quot@+id/txt_desc_nature&amp;quot
            android:layout_width=&amp;quotwrap_content&amp;quot
            android:layout_height=&amp;quotwrap_content&amp;quot
            android:layout_marginTop=&amp;quot16dp&amp;quot
            android:textColor=&amp;quot@color/black&amp;quot
            android:textSize=&amp;quot18sp&amp;quot
            android:textStyle=&amp;quotbold&amp;quot
            app:layout_constraintEnd_toEndOf=&amp;quot@+id/img_show_nature&amp;quot
            app:layout_constraintStart_toStartOf=&amp;quot@+id/img_show_nature&amp;quot
            app:layout_constraintTop_toBottomOf=&amp;quot@+id/img_show_nature&amp;quot
            tools:text=&amp;quotUser Name&amp;quot /&gt;

    &lt;/androidx.constraintlayout.widget.ConstraintLayout&gt;

&lt;/com.google.android.material.card.MaterialCardView&gt;بیاین ببینیم چی ساختیم:activity_main.xmlitem_recycler.xmlو اما خان سوم: درست کردن دیتا کلاس(ما می خواهیم یک عکس و یک توضیح نشون بدیم، پس دوتا variable داریم.)یک دیتا کلاس با نام NatureShow می سازیم.برای ساختن دیتا کلاس بجای ساختن یک کلاس ساده، Data class رو انتخاب کنید. یا خودتون دستی بسازید.data class NatureShow(
    val desc: String,
    val imgUrl: String
)خان چهارم: قدم اصلی، Adapterخب، قبل اینکه بریم سراغ کدنویسی، رو ادپتر ور بریم، ببینیم چیه؟لپ تاپ داری؟ یا نمیدونم، مانیتوری که بهش ی آداپتور وصل شده باشه، یا همون گوشی خودمون که باهاش شارژ میکنیم.ادپتری یا همون آداپتری که تو برنامه نویسی برای هندل کردن ریسایکلرویو داریم، مثل آداپتور گوشی میمونه.آداپتور شارژر میاد و برق رو میگیره و برق رو از 220w به حدی میاره که گوشی نترکه و شارژ کنه :-))وقتی برق واردش میشه (آداپتور) ی پراسسی رو میگذرونه و روش ی عملیاتی میشه و میرسه به جایگاه شارژ گوشی. خب، ایول! این آداپتر ما چی میشه این وسط؟آداپتر هم مثل همونه، میاد داده رو میگیره و توخودش داده ها رو ست میکنه و ی پراسسی رو میگذرونه و تو فایل کاتلینی ازش استفاده میکنی (ست کردن).خب، یکمی بریم تو کد و صحبت کنیم.برای ساختنش ی کلاسی میسازی و اسمشو در رابطه ریساکلرویو و یا دیتا ها میزاری.(من اسمشو NatureAdapter گذاشتم)class NatureAdapter() {
}خب، ما گفتیم برای اینکه ادپتر ما کار کنه، به دیتا هاش نیاز داره! پس به ورودی نیاز داره.class NatureAdapter(private val data: ArrayList&lt;NatureShow&gt;) {
}از نوع private val ساختم تا تو کل کلاس بتونم ازش استفاده کنم. از نوع ArrayList با جنریک NatureShow قرار میدیم تا زا دیتا کلاسمون اینجا استفاده کنیم.خب، همین؟ نه بابا، هنوز مونده!خب، به کلاسمون ی نگاهی بندازیم، ایول، اسمش که ادپتر داره، دیتا رو هم میگیره، ولی ی جای کار میلنگه...اداپتر ما هنوز به عنوان ادپتر شناخته نشده! عجب... چیکار کنیم؟ باید چیز هایی رو ایمپلمنت (implement) کنیم :-))قبل آکولاد ها میام دونقطه یا کالم { : } میزارم و برای اینکه بگم ادپتر رو برام بده، از RecyclerView استفاده میکنم و بعد ی نقطه (dot) میزارم و Adapter رو مینویسم. class NatureAdapter(private val data: ArrayList&lt;NatureShow&gt;) :
    RecyclerView.Adapter { /* ... */}همین؟ نه، عجله چرا؟براکت { &lt; &gt; } ها رو باز و بسته میزارم. به اینا تو این محل دااش جنریک میگیم! بعدش پرانتز باز و بسته!class NatureAdapter(private val data: ArrayList&lt;NatureShow&gt;) :
    RecyclerView.Adapter&lt;&gt;()&#039;{ /* ... */}این مواقعه که میتونی ی چندتا ارور ببینی، نگران نباش، کارمون هنوز تموم نشده، برا همینه :-)خب، الان ی لحظه وایسا و به کد نگاه کن...دو تا ارور داری، یکی دااش جنریک میده و یکی هم زیر اسم کلاس قرمز کشیده و اگه Alt + Enter بزنی میبینی که ی İmplement داره. نه، هنوز ی لحظه وایسا، هنوز زوده. چون قراره ی کلاس ViewHolder بسازیم.خب، بریم بسازیم! نه، نمیخواد فایل دیگه ای براش بسازیم، تو خودشم میتونیم بسازیم.خب، محمدرضا، این دااش جنریک داره گیر میده، این میون چیکار کنیم براش؟ ناسلامتی دااش محله هاا!بله بله، الان داریم دااشمونو راه میدیم. همراه باش، اول قراره دااشمونو راه میدیم.ی inner class به اسم NatureViewHolder میسازم (اسمش در رابطه با ادپتر باشه)محمدرضا، اینم ورودی میخواد؟
آره! چون قراره ازش بعدا استفاده کنیم.تو ورودیش itemView از نوع View میگیرم و میایم کلاس RecyclerView.ViewHolder() رو براش ایمپلمنت (ارث بری هم میشه گفت) میکنیم و می بینیم که RecyclerView.ViewHolder() تو ورودیش ی ویو میخواد و بهش پاس میدیم و می بینیم که بله! ارور های NatureViewHolder رفتن.همم..، پس برای RecyclerView.ViewHolder() اومدیم itemView رو تعریف کردیم؟
خب، هم آره و هم نه. نه برای اینه که فقط برای این نیستش. تو جلو ازش استفاده میکنیم.class NatureAdapter(private val data: ArrayList&lt;NatureShow&gt;) :
    RecyclerView.Adapter {
        inner class NatureViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {/*...*/}
    }خب، میتونیم به کلاس NatureAdapter برگردیم و چیزایی که نیاز داریم رو implement می کنیم.سه تا تابع onCreateViewHolder, onBindViewHolder, getItemCount رو می بینیم.ی لحظه، برا implement میرفتیم رو جایی که ارور میداد و Alt + Enter میزدیم و implement رو اتنخاب میکردیم، آره؟بله! البته اینم بگم که هر اروری implement نمیخواد! اونایی که implementation میخواد رو باید implement کرد.*حس جواد خیابانی رو بهم داد این*خب، به کد ها ی نگاهی بنداز! ببین...اینم بگم، اون TODO هارو میتونی پاک کنی، به ارور هایی که بعد پاک کردن میاد، دقت نکن! حل میشهببین، من معمولا میام تابع های onCreateViewHolder, onBindViewHolder رو زیر هم میندازم و در آخر هم getItemCount.خب، بیا با getİtemCount شروع کنیم، میایم آکولاد ها رو پاک میکنیم و به جاش = میزاریم.الان کارمون مثل موسیقی experience میره جلو! حال میکنی؟من خودم الان دارم به همین موسیقی گوش میدم! از Ludovico Einaudiبرنامه نویسی هم کد زدن نیس! لذت هم هستش! نیست؟ در کل انسانیم و کامپیوتر نیستیم و بکوب کار کنیم و استراحت و لذتی از کار نداشته باشیم.لذت ببر... :-)خب، ادامه بدیم، بعدش data.size رو مینویسم. سایز (اندازه) دیتا رو بهش پاس میدم.override fun getItemCount(): Int = data.sizeاین یکی از خوبی های کاتلینه که بتونیم از = بجای return و آکولاد باز و بسته استفاده کنیم. خب، بریم به سراغ توابع بالایی. بریم سراغ onCreateViewHolder. به وقت چای خوری تو مهمونی رسیدیم خبر نداری!! میرم و زیر کلاس ادپترم binding رو lateinit var تعریف میکنم.این lateinit var میگه این variable منو بیا بعدا پر کن! آره...private lateinit var binding: ItemRecyclerBinding(از نوع private گذاشتم و تا فقط تو این کلاس ازش استفاده کنم!)به اسم binding نگاه کن! ی بار هم کنترل رو بگیر و روش کلیک کن! و به اسم فایلی که رفته نگاه کن!اسم فایلی که رفته:  item_recycler.xml-عجب... اسم فایلی هستش که قراره دیتاهامون توش نشون داده بشن!-بله...توی onCreateViewHolder میایم و binding رو پر میکنیم و return میکنیم.یادت میاد گفتم itemView رو برای چی ساختیم و کجا ازش استفاده میکنیم؟ حالا اینجارو باش!توی onCreateViewHolder :binding = ItemRecyclerBinding.inflate(LayoutInflater.from(parent.context), parent, false)ولی همینطوری ریترن نمیکنیم! به نوع return تابعمون نگاهی بکن، NatureViewHolder هستش!عجب...! خب، خب؟میای زیر کد پر کردن binding میگی:return NatureViewHolder(binding.root)این item_recycler.xml رو بهمون برمیگردونه، باور نمیکنی کنترل رو بگیر و رو root کلیک کن!override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): NatureViewHolder {
    binding = ItemRecyclerBinding.inflate(LayoutInflater.from(parent.context), parent, false)
    return NatureViewHolder(binding.root)
}حاجی، میتونی اون پر کردن binding رو برام بگی که چرا اینجوریه؟ چرا مثل اکتیویتی نیس پر کردنش؟اولا، من حاجی نیستم، ببین، ما اینجا به layoutİnflater دسترسی نداریم و براهمین میایم و layoutInflater رو دستی میسازیم و بهش میدیم.ناگفته نماند که اون return انجام دادیم به درخواست NatureViewHolder هستش که از ما View میخواست.توی NatureViewHolder میایم و ی تابعی میسازیم به نام bind که میاد و آیتم های مارو bind میکنه،حتما اینم ورودی داره ؟آره?یک آیتم از نوع NatureShow میگیرم (برای ست کردن مقادیر)inner class NatureViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
    fun bind(data: NatureShow) { /* ... */ }
}برمیگردم به onBindViewHolder  و به تابعی که توی تابع bind گفتیم بهش آیتم رو پاس میدم. ببین:override fun onBindViewHolder(holder: NatureViewHolder, position: Int) {
    holder.bind(data[position])
}به holder توجه کن! از نوع NatureViewHolder هستش.و position رو هم باش! ببین دیتا رو مینویسی و آرایه position رو بده. گرفتی چی شد؟ data یه لیست از آرایه ای از BatureShow هستش و این position مساویه با ی خونه از آرایه که هر دفعه (به دفعات آیتم هایی که بهش میدیم) آپدیت میکنه.این بالایی رو ی چندبار بخون :-)خب، محمدرضا همین؟ دیگه آداپتر تموم؟بله!! این از ساختنش :-)یعنی چی؟ تموم نیس؟نه، ازش قراره استفاده کنیم.خب، خان های ساختن Adapter تمومه و وقت وقت استفادس!قبل اینکه بریم، ی چیزی درباره ریسایکلرویو بگم:من میگم این ریسایکلرویو خیلی باهوش و کاربردیه!چرا؟ ببین این نمیاد هر دفعه شی بسازه! ببین مثلا سه تا از آیتم ها میاد و برات نشون داده میشه. برای مثال activity_main.xml رو باز کن و به بخش Design نگاه کن.سه تا برات نشون داده؟ برا من سه تاس، بر فرض مثال، میایم و میگیم این گوشی مونه یا امولاتورمونه. میاد سه تا رو میسازه و بقیه رو فقط آیتماشو عوض میکنه!عجبب...، چقدر باهوشانه و کاربردی!خب، بیا این کارو به اتمام برسونیم.تو MainActivity.kt یا کلاس کاتلینی که تو لیوتش ریسایکلرویو رو تعریف کردی برو ی چندتا دیتای دستی بساز!val data = arrayListOf&lt;NatureShow&gt;(/* ... */)یه شی از ادپتر بساز و بهش پاس بده:val adapter = NatureAdapter(data)بعدش ست کن تو ریسایکلرویو.binding.recyclerMain.adapter = adapterیادته میگفتم میتونیم کنار هم و زیر هم نشون بدیم آیتم ها رو؟ اینجا اینکارو میکنیم.binding.recyclerMain.layoutManager = LinearLayoutManager(this, RecyclerView.VERTICAL, false)فقط، من از binding استفاده کردم ها! تو گیتهاب گفتم چطوری ادد کنیتوضیح کد بالا:میایم روی ریسایکلرویو و میگیم لیوت منجر تو LinearLayoutmanager باشه.اول context رو بهش پاس میدیم. اگه تو فرگمنت هستی requireContext یا  context رو بدی، تو اکتیویتی میتونی this رو بدی، چون توی Main-thread هستی و به کانتکست ها دسترسی داری!و بعدش بهش false میدی تا reverseLayout یا همون attchToRoot خودمنو فالس باشه و قابل اسکرول باشه!و در آخر هم ران کن و حالشو ببر!مرسی که تا اینجا اومدی! دمت گرم!! دوست دارم حسابی!!لینک گیتهاببیشترسعی کردم که یکمی جنبه فان داشته باشه نوشتم، چون معوملا نوشته های درمورد برنامه نویسی رسمی ان و خشک، بعد ی چند دقیقه خسته کننده میشه. اگه ی اشکالی یا ی چیزی برای ادد کردن داری بهم بگو لطفا، تو کامنت ها تو هم بهم ی چیزایی بگو یا لینک معرفی کن تا منم یاد بگیرم و بیشتر بتونم محتوا هامو بهتر کنم و باهم در ارتباط باشیم و از هم یاد بگیریم. و ی لایک مشتی بکوب!?درباره طرز نوشتن هم بهم بگو، اگه خوب نیس یا کافی نیس بهم بگو تا بهتر کنم :-)میخوام برای بعد با رتروفیت بیام ریسایکلرویو رو راه بندازم و بعد ها با RxJava و عرضا به حضور شما Kotlin-Flow و Kotlin-Coroutines و ...محمدرضا فکری 1402.02.01</description>
                <category>محمدرضا فکری</category>
                <author>محمدرضا فکری</author>
                <pubDate>Fri, 21 Apr 2023 01:38:46 +0330</pubDate>
            </item>
                    <item>
                <title>نوتیفیکیشن در اندروید | Notification in Android</title>
                <link>https://virgool.io/@fekri86114/%D9%86%D9%88%D8%AA%DB%8C%D9%81%DB%8C%DA%A9%DB%8C%D8%B4%D9%86-%D8%AF%D8%B1-%D8%A7%D9%86%D8%AF%D8%B1%D9%88%DB%8C%D8%AF-notification-in-android-sqepvttwwmif</link>
                <description>سلام! من محمدرضا فکری هستم، در این نوشته قصد دارم با شما به ساختار نوتیفیکیشن و استایل های آن در اندروید بپردازیم.android | اندرویدخب، این نوتیفیکیشن چیه؟برای مثال، شما دارین با گوشی تون کار می کنید و یک نوتیفیکیشن (معادل انگلیسی:‌ اطلاع، آگاهسازی و ...) از طرف پیام رسانی که ازش استفاده می کنید دریافت می کنید و پیامی که فرستاده شده را در بخش تولبار (Toolbar) نشان می دهد یا روی صفحه برای لحظه ای می آید. معمولا نوع نشان دادن مربوط به بخش نوع پیام و کدنویسی بستگی دارد. نوتیفیکیشن یکی از سرویس های اندروید می باشد.خب، حالا کدنویسی نوتیفیکیشن چطوریه؟برای ساختن نوتیفیکیشن باید از ۶ خان بگذریم :-) شامل:ساختن ویو activity_main.xmlساخت کلاس MyApp.kt (چنل) آماده کردن فایل AndroidManifest.xml (منیفست) کدنویسی MainActivity.ktکدنویسی activity_main2.xmlکدنویسی MainActivity2.ktnotificationخان اول: ساختن ویو activity_main.xmlهدف از این اپلیکیشن آشنایی و کار کردن با نوتیفیکیشن می باشد، پس به یک طراحی ساده نیاز داریم. فقط یک باتن (Button) برای نشان دادن نوتیفیکیشن!&lt;?xml version=&amp;quot1.0&amp;quot encoding=&amp;quotutf-8&amp;quot?&gt;
&lt;androidx.constraintlayout.widget.ConstraintLayout 
    xmlns:android=&amp;quothttp://schemas.android.com/apk/res/android&amp;quot
    xmlns:app=&amp;quothttp://schemas.android.com/apk/res-auto&amp;quot
    xmlns:tools=&amp;quothttp://schemas.android.com/tools&amp;quot
    android:layout_width=&amp;quotmatch_parent&amp;quot
    android:layout_height=&amp;quotmatch_parent&amp;quot
    tools:context=&amp;quot.MainActivity&amp;quot&gt;

    &lt;Button
        android:id=&amp;quot@+id/btn_show&amp;quot
        android:layout_width=&amp;quotwrap_content&amp;quot
        android:layout_height=&amp;quotwrap_content&amp;quot
        android:text=&amp;quotShow notif&amp;quot
        app:layout_constraintBottom_toBottomOf=&amp;quotparent&amp;quot
        app:layout_constraintEnd_toEndOf=&amp;quotparent&amp;quot
        app:layout_constraintStart_toStartOf=&amp;quotparent&amp;quot
        app:layout_constraintTop_toTopOf=&amp;quotparent&amp;quot /&gt;

&lt;/androidx.constraintlayout.widget.ConstraintLayout&gt;خروجی کد فوقخان دوم: ساختن چنل | Channelچنل چیه؟ و چرا؟ قبل version: 8 &amp; api-leve: 26 در اندروید، ساختن چنل اجباری نبود و زیاد قابل توجه توسعه دهنده ها نبود، بعد version: 8 &amp; api-leve: 26 ساختن چنل برای توسعه دهنده ها اجباری شد.برای شروع یک کلاس کاتلینی به نام MyApp می سازیم و آن را از Application() ارث بری می کنیم. مرحله بعدی صدا زدن تابع onCreate() می باشد. ما قرار است کدنویسی مربوط به چنل را در این بخش انجام دهیم.این کلاس قبل همه کلاس ها (حتی MainActivity) و سرویس ها اجرا می شود و آخرین کلاسی می باشد که از بین می رود. چنل روی گوشی کاربر برای یکبار ساخته می شود و دفعه بعد نصب override نمی شود. قدم اول در این کلاس ساختن notificationManager می باشد. برای ساختنش آن را مساوی با getSystemService() قرار می دهیم و NOTIFICATION_SERVICE را به ورودی آن قرار می دهیم. برای اینکه می خواهیم یک NotificationManager برگرداند از NotificationManager کست (cast) می کنیم. خب، قدم بعدی توی این خان ساختن notificationChannel می باشد.برای ساختن، notificationChannel را مساوی NotificationChannel() می گذاریم :-)تابع موردنظر از ما id, name, importance درخواست می کند. id یک چیز یونیکی هستش.به عنوان name اسمی را می دهیم که کاربر در تنظیمات می بیند. به عنوان importance کع عنوان زیادی داریم برای اضافه کردن. برای اضافه کردن از NotificationManager استفاده می کنیم.خب، اگر با من همراه بودید، الان درحال دیدن یک ارور خوبی هستید :-) از منظره لذت ببرید، چون خیلی قرار نیست به مدت طولانی ببینید، چون دلیل این می باشد که notificationChannel از ما درخواست این را دارد که یک شرطی را برایش اضافه کنیم. با فشردن کلید های Alt + Enter و انتخاب گزینه دوم را انتخاب کنید. شرط را انتخاب کنید و به بالا انتقال دهید و دو شی که ساختیم را به داخل پرانتز های شرط انتقال می دهیم. این شرط از کرش کردن برنامه جلوگیری می کند. در واقع ورژن گوشی کاربر را بررسی می کند.برای اضافه کردن توضیح اضافی، از description استفاده می کنیم.خب، قدم آخر در این خان با اعمال کردن createNotificationChannel() پایان می رسد. در ورودی آن نیز notificationChannel اضافه می کنیم.import android.app.Application
import android.app.NotificationChannel
import android.app.NotificationManager
import android.os.Build
class MyApp : Application() {

    override fun onCreate() {
        super.onCreate()

        /* check the api-level / version | is api-level 26 / version more than 8 or not. */
        if (Build.VERSION.SDK_INT &gt;= Build.VERSION_CODES.O) {

            // create notification manager
            val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager

            // create notification manager
            val notificationChannel =
                NotificationChannel(&amp;quotmy_notif&amp;quot, &amp;quotFootball&amp;quot, NotificationManager.IMPORTANCE_HIGH)
            notificationChannel.description = &amp;quotThis channel shows notifications about Football.&amp;quot

            // set notificationChannel to notificationManager
            notificationManager.createNotificationChannel(notificationChannel)

        }

    }

}خان سوم: AndroidManifest.xmlاضافه کردن:&lt;uses-permission android:name=&amp;quotandroid.permission.POST_NOTIFICATIONS&amp;quot /&gt;در بخش application به عنوان name کلاس MyApp را اضافه می کنیم.یک اکتیویتی جدید بسازید به نام MainActivity2 اسم کلاس کاتلین. activity_main2.xml به عنوان xml.تگ activity_amin2 را باز کنید و intentFilter را اضافه کنید.&lt;?xml version=&amp;quot1.0&amp;quot encoding=&amp;quotutf-8&amp;quot?&gt;
&lt;manifest xmlns:android=&amp;quothttp://schemas.android.com/apk/res/android&amp;quot
    xmlns:tools=&amp;quothttp://schemas.android.com/tools&amp;quot&gt;

    &lt;uses-permission android:name=&amp;quotandroid.permission.POST_NOTIFICATIONS&amp;quot /&gt;

    &lt;application
        android:name=&amp;quot.MyApp&amp;quot
        android:allowBackup=&amp;quottrue&amp;quot
        android:dataExtractionRules=&amp;quot@xml/data_extraction_rules&amp;quot
        android:fullBackupContent=&amp;quot@xml/backup_rules&amp;quot
        android:icon=&amp;quot@mipmap/ic_launcher&amp;quot
        android:label=&amp;quot@string/app_name&amp;quot
        android:supportsRtl=&amp;quottrue&amp;quot
        android:theme=&amp;quot@style/Theme.Notification&amp;quot
        tools:targetApi=&amp;quot31&amp;quot&gt;

        &lt;activity
            android:name=&amp;quot.MainActivity2&amp;quot
            android:exported=&amp;quottrue&amp;quot&gt;

            &lt;intent-filter&gt;
                &lt;action android:name=&amp;quotandroid.intent.action.MAIN&amp;quot /&gt;
                &lt;category android:name=&amp;quotandroid.intent.category.LAUNCHER&amp;quot /&gt;
            &lt;/intent-filter&gt;

        &lt;/activity&gt;

        &lt;activity
            android:name=&amp;quot.MainActivity&amp;quot
            android:exported=&amp;quotfalse&amp;quot /&gt;

    &lt;/application&gt;

&lt;/manifest&gt;خان چهارم: MainActivity.ktو بخش کدنویسی(کاتلین) که خودم عاشق این بخشم!!بعد ست کردن  clickListener، نوبت به ساختن نوتیفیکیشن می رسد. برای ساختن نوتیفیکیشن نیازمند notificationManager هستیم، زیرا مسئول نشان دادن می باشد.val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
برای ساختن نوتیفیکیشن:val notification = NotificationCompat
    .Builder(this, &amp;quotmy_notif&amp;quot)از دیزاین پترن Builder() استفاده می کنیم. ontext و channelId را در ورودی اضافه می کنیم.بعد، می توانیم تغییراتی مثل اضافه کردن آیکون و نوشته را اعمال کنیم. در آخر نیز build() را اضفه می کنیم، زیرا نوتیفیکیشن در حالت ساخت می باشد و برای اینکه ساختش رسمی شود، build() را ضافه می کنیم.Anatomy of a Notification(1) آیکون کوچک(Small icon): با setSmallIcon اعمال می شود.(2) اسم اپلیکیشن: سیتسم به صورت خودکار اعمال می کند.(3) سیستم خودش در صورت نیاز اضافه می کند ولی برای اعمال کردن به صورت دستی: setWhen() و برای پنهان کردن: setShowWhen(false) (4) آیکون بزرگ(Large icon): برای اعمال کردن setLargeIcon() این تابع در ورودی خود عکس از نوع bitmap می گیرد و برای اضافه کردنش از BitmapFactory استفاده می کنیم.(5) عنوان محتوا(content title): setContentTitle() برای اعمال کردن.(6) نوشته عنوان(content text): setContentText() برای اعمال کردن.فرمت های عکس در اندروید: file, bitmap, drawable و ریسورس های دیگر که قابلیت اضافه شدن را داشته باشد یا آدرس اینترتی باشد.یک توضیح کوتاه درباره اضافه کردن آیکون بزرگ: برای اضافه کردن فایلی که در فایل drawable شما قرار دارد، از BitmapFactory استفاده می کنیم و از تابع decodeResource() برای اضافه کردن استفاده می کنیم. در پارامتر اول resources استفاده می کنیم تا ریسورس های اندروید را به قولی پاس بدهیم :-) باید بعد ساختن به نوتیفیکیشن منجر پوش کنیمدر پارامتر دوم حالت عادی پاس دادن عکس از فایل drawableسورس کد مربوطه: val notification = NotificationCompat
    .Builder(this, &amp;quotmy_notif&amp;quot)
    .setSmallIcon(android.R.drawable.stat_notify_chat)
    .setLargeIcon(BitmapFactory.decodeResource(resources, R.drawable.ic_launcher_background))
    .setContentTitle(&amp;quotMohammad-Reza Fekri&amp;quot)
    .setContentText(&amp;quotHello. Would like to have a cup of coffee?&amp;quot)
    .build()notificationخب، ما می دانیم که MainActivity2 قرار است اول نشان داده شود. ما می خواهیم با استفاده intent وقتی روی نوتیفیکیشن کلیک شد بیاید به MainActivity. پس برای همین intent تعریف می کنیم. ما می خواهیم intent مارا اندروید پر کند، پس برای همین از pendingIntent استفاده می کنیم.کد های زیر را به بالای کلیک لیستنر ادد می کنیم:val intent = Intent(this, MainActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK.or(Intent.FLAG_ACTIVITY_CLEAR_TASK)
val pendingIntent = PendingIntent.getActivity(this, 12, intent, 0)توضیح intent: از هر جایی که هست به MainActivity بر گردد و فلگ اینتنت را خالی می کنیم (به قولی). تازه سازی صفحه. ما می خواهیم در کل فقط به MainActivity دسترسی داشته باشیم و وقتی روی نوتیفیکیشن کلیک شد به MainActivity برود. (شما می توانید تغییر دهید)توضیح pendingIntent: برای کانتکست this پاس می دهیم. برای کد درخواستی نیز یک عدد تصادفی اضافه می کنیم. بخش سوم نیز یک فلگ از ما درخواست می کند که ما قرار نیست چیزی اضافه کنیم و برای همین عدد 0 را اضافه می کنیم.برای اعمال کردن تغییرات فوق به نوتیفیکیشن قبل build() : .setContentIntent(pendingIntent)وظیفه نشان دادن نوتیفیکیشن برای NotificationManager می باشد. در آخر نیز  روی نوتیفیکیشن منجر تابع notify() صدا می زنیم:notificationManager.notify((10..1000).random(), notification)من خواستم که اعداد از ۱۰ تا ۱۰۰۰ به طور رندوم ساخته شوند تا نوتیفیکیشن های بدون وابستگی ساخته شود.خب، اگر چیزی اجرا کنید فکر نکنم چیز جالبی ببینید. پس بیاید بریم برای کامل کردن MainActivity2 :-)styles of notificationخان چهارم: activity_main2.xml من می خواهم در این اکتیویتی به سه تا از استایل های نوتیفیکیشن بپردازم.استایل هایی که قرار است بپردازیم: big picture style, big text style, inbox styleبه ویو خاصی نیاز ندارم. چون قرار است به سه نوع استایل ها بپردازیم من به سه تا باتن (button) نیاز دارم.دیزاین ما جوری خواهد بود که سه تا باتن(button) در وسط خواهند بود و زیر هم. از ConstraintL استفاده می کنیم.&lt;?xml version=&amp;quot1.0&amp;quot encoding=&amp;quotutf-8&amp;quot?&gt;
&lt;androidx.constraintlayout.widget.ConstraintLayout xmlns:android=&amp;quothttp://schemas.android.com/apk/res/android&amp;quot
    xmlns:app=&amp;quothttp://schemas.android.com/apk/res-auto&amp;quot
    xmlns:tools=&amp;quothttp://schemas.android.com/tools&amp;quot
    android:layout_width=&amp;quotmatch_parent&amp;quot
    android:layout_height=&amp;quotmatch_parent&amp;quot
    tools:context=&amp;quot.MainActivity2&amp;quot&gt;

    &lt;Button
        android:id=&amp;quot@+id/btn1&amp;quot
        android:layout_width=&amp;quotwrap_content&amp;quot
        android:layout_height=&amp;quotwrap_content&amp;quot
        android:text=&amp;quotBig picture style&amp;quot
        app:layout_constraintBottom_toTopOf=&amp;quot@+id/btn2&amp;quot
        app:layout_constraintEnd_toEndOf=&amp;quotparent&amp;quot
        app:layout_constraintStart_toStartOf=&amp;quotparent&amp;quot
        app:layout_constraintTop_toTopOf=&amp;quotparent&amp;quot
        app:layout_constraintVertical_chainStyle=&amp;quotpacked&amp;quot /&gt;

    &lt;Button
        android:id=&amp;quot@+id/btn2&amp;quot
        android:layout_width=&amp;quotwrap_content&amp;quot
        android:layout_height=&amp;quotwrap_content&amp;quot
        android:text=&amp;quotBig text style&amp;quot
        app:layout_constraintBottom_toTopOf=&amp;quot@+id/btn3&amp;quot
        app:layout_constraintEnd_toEndOf=&amp;quotparent&amp;quot
        app:layout_constraintStart_toStartOf=&amp;quotparent&amp;quot
        app:layout_constraintTop_toBottomOf=&amp;quot@+id/btn1&amp;quot /&gt;

    &lt;Button
        android:id=&amp;quot@+id/btn3&amp;quot
        android:layout_width=&amp;quotwrap_content&amp;quot
        android:layout_height=&amp;quotwrap_content&amp;quot
        android:text=&amp;quotInbox style&amp;quot
        app:layout_constraintBottom_toBottomOf=&amp;quotparent&amp;quot
        app:layout_constraintEnd_toEndOf=&amp;quotparent&amp;quot
        app:layout_constraintStart_toStartOf=&amp;quotparent&amp;quot
        app:layout_constraintTop_toBottomOf=&amp;quot@+id/btn2&amp;quot /&gt;

&lt;/androidx.constraintlayout.widget.ConstraintLayout&gt;با تن اول: big picture imageباتن دوم: big text styleبا تن سوم: inbox styleخان چهارم: MainActivity2خب، خب، رسیدیم به خان آخر، دمت گرم که تا اینجا اومدی :-) بیا بریم ادامه ش :-)قدم اول: ساختن instance ها و شیٔ های مورد نیاز:پس اول از شیٔ notificationManager شروع می کنیم. شیٔ که مورد نظر ما از نوع NotificationManagerخواهد بود و منتظر ما خواهد بود تا پر شود، پس lateinit var خواهد بود. قبل onCreate() تعریف می کنیم تا در کل اکتیویتی دسترسی داشته باشیم.و ما به pendingIntent برای اتصال به اکتیویتی (وقتی به نوتیفیکیشن کلیک شد به MainActivity برود)، این را نیز lateinit var تعریف می کنیم. در داخل تابع onCreate() اینتنتی که در MainActivity ساخته ایم را تکرار می کنیم(هدف از intent برگشت به MainActivity است):val intent = Intent(this, MainActivity::class.java)برای پر کردن pendingIntent که منتظر ما هست، مثل MainActivity پر می کنیم:pendingIntent = PendingIntent.getActivity(this, 12, intent, 0)خب، نوتیفیکیشن را نیز مانند MainActivity درست می کنیم ولی با این تفاوت که از buil() استفاده نمی کنیم چون برای اعمال کردن استایل استفاده خواهیم کرد:val notification = NotificationCompat
    .Builder(this, &amp;quotmy_notif&amp;quot)
    .setSmallIcon(android.R.drawable.stat_notify_chat)
    .setLargeIcon(
        BitmapFactory.decodeResource(
            resources,
            R.drawable.img_android
        )
    )
    .setContentTitle(&amp;quotMohammad-Reza Fekri&amp;quot)
    .setContentText(&amp;quotHello. Would like to have a cup of coffee?&amp;quot)
    .setContentIntent(pendingIntent)قدم دوم:‌ اعمال کردن onClickListener برا باتن ها و استایل ها:binding.btn1.setOnClickListener {

    intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK.or(Intent.FLAG_ACTIVITY_CLEAR_TASK)
    notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager

    val notificationWithBigPicStyle =
        notification.setStyle(
            NotificationCompat.BigPictureStyle()
                .bigPicture(
                    BitmapFactory.decodeResource(
                        resources,
                        R.drawable.img_humanity
                    )
                )
        ).build()
    notificationManager.notify((10..1000).random(), notificationWithBigPicStyle)

}توضیح notificationWithBigPicStyle: به نوتیفیکیشنی که گذاشتیم در حالت build بماند setStyle() را اضافه می کنیم. از NotificationCompat استفاده می کنیم و از BigPictureStyle() استفاده می کنیم.این استایل، تابعی به نام bigPicture() دارد و عکس را از نوع Bitmap قبول می کند. بعد از اضافه کردن عکس مورد نظر نوتیفیکیشن را بیلد می کنیم و به notificationManager که وظیفه اش نشان دادن می باشد پاس میدیم :-)binding.btn2.setOnClickListener {

    intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK.or(Intent.FLAG_ACTIVITY_CLEAR_TASK)
    notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager

    val notificationBigTxtStyle =
        notification.setStyle(
            NotificationCompat.BigTextStyle().bigText(
                &amp;quotHey you. How are you doing? Hope ur doing well.\n&amp;quot +
                        &amp;quotCan we have a meeting about the design of the Application?&amp;quot +
                        &amp;quot I think we need to make change. So, this is my opinion about the design.\n&amp;quot +
                        &amp;quotOh my god... , look at me.. I&#039;m really crazy, because this text is for testing my application new-option.\n&amp;quot +
                        &amp;quotI&#039;m actually talkative. yes. I think I&#039;m so cool. handsome..., clever... .\n&amp;quot +
                        &amp;quotIn a couple of days, I&#039;m trying hard to make myself better, and update myself. I meant that I&#039;m trying to make myself cool.\n&amp;quot +
                        &amp;quotOf course, it&#039;s not important that I&#039;m cool or something like this. It&#039;s important that I&#039;m trying and going on.&amp;quot
            )
        ).build()

    notificationManager.notify((10..1000).random(), notificationBigTxtStyle)

}اولا، به نوشته ها دقتی نکنید? برای کابردی بودن استایل ی چیزایی نوشتم.این استایل اعمال شده به باتن دوم مثل استایل قبلی می باشد فقط با این تفاوت که به جای عکس نوشته نشان می دهد. همچنین از نظر کدنویسی تنها این تفاوت را دارد که از BigTextStyle().bigText() استفاده شده است.binding.btn3.setOnClickListener {

    intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK.or(Intent.FLAG_ACTIVITY_CLEAR_TASK)
    notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager

    val notificationInboxTxtStyle =
        notification.setStyle(
            NotificationCompat.InboxStyle()
                .addLine(&amp;quotDo you wanna seen?&amp;quot)
                .addLine(&amp;quotWhy don&#039;t you seen?&amp;quot)
                .addLine(&amp;quotWhat&#039;s the cause?&amp;quot)
                .addLine(&amp;quotCome on...&amp;quot)
        ).build()

    notificationManager.notify((10..1000).random(), notificationInboxTxtStyle)

}با این حال به این نتیجه می رسیم که چگونه می شود به یک نوتیفیکیشن استایل اعمال کرد.اینجا هم از InboxStyle() استفاده می کنیم. InboxStyle() به ما این توانایی را می دهد تا نوشته های زیادی رو با توجه به نیاز اضافه کنیم(و همچنین به نوع عملکرد خودش)در آخر از شما متشکرم که تا اینجا اومدین. لایک و کامنت یادتون نره. امیدوارم مفید بوده باشه برای شما :-)لینک گیتهاب پروژه:‌ notification-androidلینک سایت اصلی: Notification Overviews</description>
                <category>محمدرضا فکری</category>
                <author>محمدرضا فکری</author>
                <pubDate>Sat, 21 Jan 2023 00:41:49 +0330</pubDate>
            </item>
                    <item>
                <title>برنامه نویسی اندروید Android Programming</title>
                <link>https://virgool.io/fboard/%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-android-programming-alo5agaucex9</link>
                <description>شروع (اولیه) : تا سه نشه، بازی نشه برای شروع همه زبان های برنامه نویسی، اولین چیز یک کامپیوتر، لب تاپ و یا یک گوشی (برنامه نویسی با گوشی، آن هم که اندروید باشد، تقریبا هیچوقت می توانید. گوشی برای برنامه نویسی پایتون، جاوا و... خوب است، بهتر است که انتخاب نشود) در کل یک پلتفرم باشد که شما بتوانید کار های خودتان را انجام دهید. دومین چیز اینترنت می باشد. با توجه به مثال بالا: تا سه نشه، بازی نشه. اینجا هم اینترنت نقش فوق العاده اصلی را دارد. یعنی، در رتبه دوم می نشیند.سوم، یک وی پی ان (VPN) خوب است. وی پی ان یا قفل شکن در اندروید مخصوصا برای گریدل(Gradle)خیلی لازم است، به قولی وی پی ان دستان شما را بازتر نگه می دارد،برای یادگیری هم لازم می باشد. اینها در کل شاخه های اولیه لازم بودند. اما قبل از آنها شما باید علاقه داشته باشید و بخواهید. علاقه ای که بتواند شما را با خطاهایی که شما بدون اینکه بخواهید به وجود می آورید درستش می کنید، و یا با خطاهای گریدل، سر و کار داشتن با SDK ، JDK و یاد گرفتن جاوا و Git, Gitlab, Github و خیلی از کارها که منتظر شماست، شما را خوشحال نگه دارد.  ولی اگر بخواهید حتما می توانید :))) خیلیها توانسته اند، چرا نشود؟؟ (روحیه دادن خیلی مهم است)اندروید: جاوا، کاتلین و XMLXMLایکس ام ال (XML) و پایتون(Python):ایکس ام ال، در کل برای طراحی (design) می باشد. شما می آیید و چندتا باتم و عکس و ... می گذارید. در کل xml مثل این می ماند که مثلا شما می آیید در زبان پایتون از متد ترتل (turtle) یک شکل می کشید. در xml کشیدن متفاوت است، ولی در کل مثل یکدیگر هستند. این زبان یکی از زبانهایی است که شما را به چالش می کشد. تنها راه، تمرین کردن است.تمرین کردن کلید طلایی هرچیزی در دنیا است.خب، با xml طراحی می کنیم، پس جاوا و کاتلین چی؟؟جاوا و کاتلینجاوا یکی از زبان های برنامه نویسی سطح بالا می باشد که به صورت رایگان در  اختیار برنامه نویسان قرار می گیرد. جاوا به عنوان کارآمدترین و محبوبترین زبان در بین زبان های برنامه نویسی سطح بالا به حساب می آید. زبان  برنامه نویسی Java بیشتر در برنامه نویسی اپلیکشین‌ های اندروید مورد استفاده قرار می گیرد و کاربرد دارد. Java در سال ۱۹۹۵ به وسیله شرکت  Sun Microsystems معرفی شد و در نهایت به وسیله اوراکل خریداری شد.از آنجا که زبان برنامه نویسی کاتلین زبانی جدیدتر از جاواست در حال حاضر برای توسعه  و برنامه نویسی اپلیکیشن اندروید از زبان کاتلین هم استفاده می شود.اولین توسعهٔ آن توسط تیم برنامه‌نویسان جت  برینز (Jet Brains) واقع در سن پترزبورگ روسیه انجام شد. (این نام از روی  جزیره کاتلین در نزدیکی سن پترزبورگ می‌آید.) کاتلین در ژانویهٔ سال ۲۰۱۲ به عنوان زبان ماه انتخاب شددر کل از این زبانها چه استفاده ای می شود؟؟جواب: از این زبانها برای شخصیت دهی استفاده می شود. مثلا شما به فلان عکس می گویید که چه کار کند و یا به فلان باتم (Bottom) می گویید که وقتی روی تو کلیک شد چی کار بکنی. کدام یک از این زبانها برای برنامه نویسی خوب است؟؟ در کل هر دو برای برنامه نویسی خوب هستند. ولی برای شروع جاوا بهتر است. من شخصا به جاوا علاقه زیادی دارم.ای پی کی یا همون APKخب، بعد اینکه نوشتی چی؟ گفتی فلانی این کار را بکند، و فلانی این کار را. در آخر چی؟؟ می آیید به بخش بیلد(Build) و &quot;Generate Signed By Bundle / APK&quot; را انتخاب می کنید، بعد، یک پوشه مانندی برای شما باز می شود که شما آنجا، APK را انتخاب می کنید و Next را می زنید و Key store خودتان را اضافه می کنید(اگه ندارید، می توانید درست کنید. &quot;CREATE A NEW...&quot; را انتخاب کنید و درست کنید).خب، بعدش دو گزینه می آید، و شما release را انتخاب می کنید و بعد، finish را می زنید و تمام... منتظر می شوید که دالود بشه، بعد این APK و این شما...من شخصا از برنامه نویسی این را فهمیدم که برنامه نویسی مخصوصا که اندروید / جاوا باشد، مانند زیست شناسی(بخش OOP در جاوا) و ... است. ممنون از شما ... .</description>
                <category>محمدرضا فکری</category>
                <author>محمدرضا فکری</author>
                <pubDate>Thu, 03 Mar 2022 18:53:29 +0330</pubDate>
            </item>
            </channel>
</rss>