<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های Zahra Ghaffarpour</title>
        <link>https://virgool.io/feed/@zahragh</link>
        <description></description>
        <language>fa</language>
        <pubDate>2026-06-16 10:35:32</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/3519/avatar/avatar.png?height=120&amp;width=120</url>
            <title>Zahra Ghaffarpour</title>
            <link>https://virgool.io/@zahragh</link>
        </image>

                    <item>
                <title>چه تفاوتی بین Recyclerview و Listview وجود دارد؟</title>
                <link>https://virgool.io/@zahragh/%DA%86%D9%87-%D8%AA%D9%81%D8%A7%D9%88%D8%AA%DB%8C-%D8%A8%DB%8C%D9%86-recyclerview-%D9%88-listview-%D9%88%D8%AC%D9%88%D8%AF-%D8%AF%D8%A7%D8%B1%D8%AF-lqioyehi5a1y</link>
                <description>در این پست قصد دارم راجع به دو مورد از ابزارهای پرکاربرد اندروید  به نام لیست ویو و ریسایکلرویو که برای نمایش لیست ها  از آن‌ها استفاده میشود صحبت کنم و تجربه ای را که از کار کردن با این ابزار ها یدست آوردم  هر چند هم که کم باشد در اختیارتان بگذارم.فرض کنید میخواهیم یک دفترچه تلفنی ایجاد کنیم که لیستی از نام مخاطب های شما را نمایش میدهد که میتوانید این لیست رو اسکرول کنید، و با انتخاب هر یک از مخاطب ها جزئیات مربوط به آن را ببینید و... .  برای پیاده سازی  این دفترچه تلفن از ابزار لیست‌ویو میتوانیم استفاده کنیم، ابزار دیگری که بعد از اندروید ۵ معرفی شده است ریسایکلرویو هست که مشکلاتی که در لیست‌ویو وجود داشت را تا حدود زیادی حل کرده و یک نسخه پیشرفته‌تر و انعطاف ‌پذیرتر از لیست‌ویو هست. در ادامه سعی میکنم هریک از این ابزار ها را با مثالی معرفی کنم و در نهایت تفاوت‌هایشان را شرح دهم که چه فرقی میکند برای پیادده سازی یک دفترچه تلفن از لیست‌ویو  اسنغاده کنیم یا  از ریسایکلرویو استفاده کنیم؟همانظور که عرض کردم لیست‌ویو مجموعه‌ای از اطلاعات است که بصورت عمودی روی هم قرار گرفته اند و قابل اسکرول به بالا و پایین هستند.برای ایجاد دفترچه تلفن اول باید مجوعه داده‌هایی که میخواهیم نشان بدهیم  را تعریف کنیم (مثلا لیست افراد و شماره تماس آن ها در یک آرایه رشته‌ای یا دیتابیس و...). سپس یک واسط یا آداپتری تعریف میکنیم که اطلاعات هر یک از آیتم های آرایه را برداشته و در آیتم متناظر در لیست ویو بارگذاری میکند(Bind میکند). مشکلی که در پیاده سازی لیست‌ویو پیش می‌آید این است که ممکن است فضای حافظه برای مجموعه داده هایی که در حافظه بارگذاری می شوند پاسخگو نباشد و با ارور هایی (به اصطلاح out of memory)مواجه شویم. مساله های دیگری هم در مورد لیست ویو وجود دارد که یا پیچیدگی زیادی دارند یا انعطاف لازم را ندارند در ادامه با مثال توضیح میدهم. همانطور که در  تصویر بالا می بینید ما ده تا مخاطب ایجاد کردیم که کد هایش به این ترتیب است:در فایل xml:&lt;ListView
    android:id=&quot;@+id/list&quot;
    android:layout_width=&quot;wrap_content&quot;
    android:laynv h;out_height=&quot;wrap_content&quot;/&gt;در اکتیویتی:لیست را با آی دی مربوطه تعریف می کنیم:ListView listView=(ListView) findViewById( R.id. list ); سپس آرایه ای رشته ای شامل نام مخاطب هایمان را تعریف می کنیم و آیتم هایش را اضافه می کنیمList&lt;String&gt; items=new ArrayList&lt;&gt;();

items.add( &quot;Contact 1&quot; );
items.add( &quot;Contact 2&quot; );
items.add( &quot;Contact 3&quot; );
items.add( &quot;Contact 4&quot; );
items.add( &quot;Contact 5&quot; );
items.add( &quot;Contact 6&quot; );
items.add( &quot;Contact 7&quot; );
items.add( &quot;Contact 8&quot; );
items.add( &quot;Contact 9&quot; );
items.add( &quot;Contact 10&quot; );حال واسط یا آداپتر را تعریف میکنیم که آرایه مان را به عنوان پارمتر میگیرد و محتوای آن را داخل لیست ویو نشان میدهد. ArrayAdapter&lt;String&gt; arrayAdapter=
 new ArrayAdapter&lt;String&gt;( this,R.layout.support_simple_spinner_dropdown_item,items);
listView.setAdapter( arrayAdapter );پارامتر اول context مربوطه ، پارامتر دوم قالب هر سطر(آیتم)‌‌لیست است که بطور پیش فرض در  اندروید تعریف شده و پارمتر سوم منبع داده هاست.اگر دقت کنید اینجا از ArrayAdapter استفاده کردم چون منبع داده ما از نوع آرایه‌ی رشته ای هست باید از ArrayAdapter استفاده کنیم. نوع دیگه از آداپتر BaseAdapter هست که  ArrayAdapter  از آن ارث بری می کند استفاده خواهیم کرد و عمومی تر است. یعنی BaseAdapter  یک کلاس انتزاعی هست که اینترفیس های Adapter  و ListAdapter و spinnerAdapter  را پیاده سازی می کند. در جاوا یک کلاس  چندین اینترفیس را می تواند پیاده سازی کند ولی یک کلاس فقط میتواند از یک کلاس ارث بری کند. در اینجا ArrayAdapter به جای پیاده سازی اینترفیس های ذکر شده ،از کلاس baseadapter ارث بری می کند. بحث آداپتر ها کمی مفصلتر هست که انشالله در یک پست جداگانه در موردش صحبت می کنیم.تا اینجا فقط نام مخاطب هایمان را نمایش میدهیم برای اینکه بقیه جزئیات آن ها را نشان دهیم کلاسی برای مخاطب هایمان  تعریف می‌کنیم و متغیرها وویژگی های هر مخاطب را تعریف می‌‌ کنیم.در واقع مخاطب ما یک مدل هست(Model) و با ایجاد یک نمونه از این مدل میتوانیم مخاطب هایمان را ایجاد کنیم. public class Friend {
  String name;
  String phone;
  
  public Friend(String name,String phone){
  this.name=name;
  this.phone=phone;  }
  
  public String getname(){
  return name;
  }
  public String getPhone(){
    return phone;
}
public void setName(String name){
    this.name=name;}

public void setPhone(String phone){
    this.phone=phone;
}} من  اینجا یک مدل به نام friend برای مخاطبانم تعریف کردم که هر مخاطب دارای یک نام و شماره تماس هست. متدهایی هم برای تنظیم مقدار این متغیرها یا برگرداندن مقدار متغیرها تعریف کردم.مثل مثال قبلی مخاطب هایمان را ایجاد کرده و به لیستمان اضافه می‌کنیم و در نهایت آداپتر را به لیست‌ویو متصل میکنیم.ListView friendsecoundlist=(ListView)findViewById( R.id.friendsecoundlist );
List&lt;Friend&gt; friendList=new ArrayList&lt;&gt;( );

Friend contact1=new Friend( &quot;Contact 1&quot;,&quot;0933--------03&quot; );
Friend contact2=new Friend( &quot;Contact 2&quot;,&quot;0914--------64&quot; );
Friend contact3=new Friend( &quot;Contact 3&quot;,&quot;0914--------89&quot; );
Friend contact4=new Friend( &quot;Contact 4&quot;,&quot;0914--------33&quot;);
Friend contact5=new Friend( &quot;Contact 5&quot;,&quot;0336--------05&quot;);

friendList.add( contact1);
friendList.add( contact2 );
friendList.add( contact3 );
friendList.add( contact4 );
friendList.add( contact5 );

FriendBaseAdapter  Friendadapter=new FriendBaseAdapter(this,friendList );
friendsecoundlist.setAdapter( Friendadapter );کلاس آداپتر: public class FriendBaseAdapter extends BaseAdapter {

    public List&lt;Friend&gt; friendList;
    public Context context;
 //متد سازندهpublic FriendBaseAdapter(Context mcontext,List&lt;Friend&gt; friendList ){
  this.friendList=friendList;
  this.context=mcontext;  }
 //مجوع آیتم های موجود در آداپتر را به شما نشان میدهد@Override
  public int getCount() {
  return friendList.size();  }
//اطلاعات آیتم مربوطه که به عنوان پارمتر به متد داده میشود @Override
  public Object getItem(int position) {
  return friendList.get( position );  }
 //ترتیب نمایش آیتم ها را  نشان میدهد که ممکن است با همون ترتیبی باشد که در منبع داده مان هست
 @Override
  public long getItemId(int position) {
  return position;  }
 // ویوی هر آیتم را فراهم میکند ممکن  است این ویو یه تکست ویوی ساده باشد یا یک لیوت پیچیده باشه. پارامتر دوم  برای این هست که ویویی که ایجاد می کنیم بتوانیم  دوباره استفاده کنیم ولی در ابتدا
  null 
 . هست@Override
  public View getView(int position,View convertView,ViewGroup parent) {
  Friend contact = (Friend) getItem(position);
  View v;
  if (convertView == null) {
  v = LayoutInflater.from(context).inflate(R.layout.contact_item_layout, null);}
  else {v = convertView;  }
  TextView tvName = (TextView) v.findViewById(R.id.name);
  TextView tvphone = (TextView) v.findViewById(R.id.phone);  tvName.setText(contact.getname());
        tvphone.setText(contact.getPhone());
        return v;
    }
}نتیجه:البته نوع دیگری از لیست ویو ووجود دارد به نام HorizontalListview که این امکان را به ما میدهد که لیست ویومان بصورت افقی باشد.ولی به دلیل محدودیت ها و پیاده سازی پیچیده  امروزه به ندرت از آن استفاده می شود.ریسایکلرویوریسایکلرویو یک نسخه پیشرفته‌تر و انعطاف‌پذیرتر از ListView هست در RecyclerView، شما می توانید با  چند مولفه(view) مختلف و محدود داده‌های زیادی را به راحتی  نمایش دهید. ریسایکلر ویو خودش را با ویو هایی که از یک  layout managers که شما بهش دادید میگیرد و پر میکند. شما می توانید از یکی از  layout managers های استاندارد مانند LinearLayoutManager یا  GridLayoutManager و... استفاده کنید یا خودتان پیاده سازی کنید.LinearLayoutManager mylayoutManager =
 new LinearLayoutmanager(this,LinearLayoutManager.vertical,false) در کد بالا LiniearLayoutManager را تعریف می کنیم که پارمتر اول context  مربوطه ، پارمتر دوم نحوه ی نمایس که در اینجا عمودی هست و مفدار دوم افقی هم می تواند باشد، پارمتر سوم ترتیب نمایش هست که اگر false یاشد به ترتیب نمایش خواهد داد.ویو ها در لیست توسط اشیاء viewHolder نمایش داده میشوند این اشیاء نمونه هایی از کلاسی هستند که ازRecyclerView.ViewHolder   ارث بری می کند.هر viewholder مسئول نمایش یک آیتم واحد با یک ویو هست. مثلا در مثال خودمان که قبلا ذکر کردم هر ویوهلدر یک مخاطب را نمایش میدهد.ریسایکلرویو تنها به تعدادی ویو هلدر ایجاد می کند که برای نمایش در بخش صفحه اسکرین مورد نیاز است. یعنی تنها آیتم های در حال نمایش را در حافظه بارگذاری می کند. زمانی که کاربر لیست را اسکرول می کند ریسایکلرویو ویوهای خارج از صفحه را می گیرد و محتویات قدیمی آن‌ها را با محتویات جدید جایگزین میکند. با اینکه کار با ریسایکلرویو کمی سختتر  و پیچیده تر است ولی کارایی و انعطافش از لیست ویو بیشتر ست. از جمله کارهای بهینه سازی  که ریسایکلرویو خودش انجام میدهد:·زمانیکه لیست برای اولین بار پر می شود تعدادی  ویوهلدر را در هر دو طرف لیست ایجاد و بایند میکنه.به عنوان مثال، اگر ویو، موقعیت۰ تا ۹ را نمایش بدهد ریسایکلرویو ویوهلدرهای ۰ تا ۹ رو ایجاد و بایند میکند و همچنین ممکن است   viewHolder  را برای موقعیت ۱۰ هم  ایجاد و بایند کند به این ترتیب، اگر کاربر لیست را اسکرول کند، آیتم  بعدی آماده‌ی نمایش است.زمانیکه کاربر لیست را اسکرول میکند ریسایکلرویو ویوهلدر های جدید را در صورت لزوم ایجاد می کند و هم چنین ویوهلدرهایی که از صفحه نمایش خارج شده‌اند را ذخیره می کند بنابراین آنها میتوانند دوباره استفاده شوند. اگر کاربر لیست را اسکرول کند، ویوهلدرهایی که مدت طولانی از صفحه نمایش خارج شده اند  با داده های جدید مجددا جایگزین می شوند و لازم نیست ویو هلدر از اول ایجاد شود و فقط محتوای ویو  را  به روز می‌کند تا مطابق با آیتم جدید نمایش داده شود.هنگامی که  در آیتم های نمایش داده شده تغییراتی اتفاق می افتد (مثلا اضافه کردن آیتم به لیست علاقمندی ها) شما میتوانید با استفاده از متد adapter.notifiydatasetchang به آداپتر اعلام کنید که آداپتر فقط آیتم های تغییر یافته را بایند کند و محتوایشان را به روز کند.شکل پایین بطور کلی نحوه ی کار ریسایکلرویو را نمایش می دهد.نحوه ی استفادهاول از همه کتابخانه مورد نیاز را در فایل گریدل  اضافه کنید سپس گزینه synk  را بزنید تا فایل های مورد نیاز به پروژه تان اضافه شود.dependencies {
  implementation &#039;com.android.support:recyclerview-v7:27.1.0&#039;
}سپس در  فایل xml مورد نظر خود کدهای زیر را اضافه کنید.&lt;android.support.v7.widget.RecyclerView
    android:id=&quot;@+id/my_recycler_view&quot;
    android:scrollbars=&quot;vertical&quot;
    android:layout_width=&quot;match_parent&quot;
    android:layout_height=&quot;match_parent&quot;/&gt;در ادامه در فایل جاوای خود ریسایکلر ویو رو با آی دی مورد نیاز یافته وآداپتر را به آن متصل میکنیم.public class MyActivity extends Activity {

    private RecyclerView mRecyclerView;
    private RecyclerView.Adapter mAdapter;
    private RecyclerView.LayoutManager mLayoutManager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.my_activity);
  mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
  mLayoutManager = new LinearLayoutManager(this,LinearLayoutManager.Vertical,false);          
  mRecyclerView.setLayoutManager(mLayoutManager); 
//این تنظیم برای بهبود عملکرد ریسایکلرویو استفاده می شود تا زمانی که اندازه محتوای 
  ریسایکلرویو تغییر می‌کند اندازه لیوت مربوطه ثابت می ماند
  در غیر اینصورت هر بار که آیتمی به اداپتر اضافه یا حذف می شود ریسایکلرویو باید بررسی کند تا اندازه اش را تغییر دهد در صورنی که  مقدار 
  true‌
  را به این متد دهیم درواقع اندازه ریسایکلرویو به اندازه محتوای آداپتر وایسته نیست.
 mRecyclerView.setHasFixedSize(true);
List&lt;Friend&gt; friendList=new ArrayList&lt;&gt;( );

Friend contact1=new Friend( &quot;Contact 1&quot;,&quot;0933----03&quot; );
Friend contact2=new Friend( &quot;Contact 2&quot;,&quot;0914----64&quot; );
Friend contact3=new Friend( &quot;Contact 3&quot;,&quot;0914----89&quot; );
Friend contact4=new Friend( &quot;Contact 4&quot;,&quot;0914----33&quot;);
Friend contact5=new Friend( &quot;Contact 5&quot;,&quot;0336----05&quot;);

friendList.add( contact1);
friendList.add( contact2 );
friendList.add( contact3 );
friendList.add( contact4 );
friendList.add( contact5 );تعریف و مشخص کردن آداپتر  mAdapter = new MyAdapter (this,friendList);
  Friendadapter.setClickListener( new View.OnClickListener() {
  
    @Override
    public void onClick(View v) {
   Toast.makeText( FriendSecoundActivity.this,&quot;Contact&quot;,Toast.LENGTH_SHORT ).show();
    }
} );
  mRecyclerView.setAdapter(mAdapter);      } 
          ... اضافه کردن آداپتربرای انتقال تمام اطلاعات خود به لیست شما باید از کلاس  Recyclerview.Adapter   ارث بری کنید.این شی  ویوی آیتم های لیست را درست میکند و با محتوای مربوط به هر آیتم پر می کند.مثلا در کد زیر نمایش می دهد که چطور هر آیتم از مخاطب‌ها را در هر سطر ریسایکلرویو نمایش می‌دهد .هر آیتم ریسایکلرویو در این مثال شامل یک textview برای نام و یک textview برای تلقن هست که این ویوها برای هر آیتم در برنامه های مختلف می تواند متفاوت باشد.public class MyAdapter extends RecyclerView.Adapter&lt;MyAdapter.ViewHolder&gt; { public   List&lt;Friend&gt; friendList;
private Context context;

    آماده سازی مرجع برای ویو هر آیتم//

 برای هر ایتم می باشد در آیتم های پیچیده نیازمند بیش از یک ویو  //و شما در ویوهلدر دسترسی به همه ویوهای ایتم مورد نظر را فراهم میکنید.//
  public static class ViewHolder extends RecyclerView.ViewHolder {
 TextView tvName;
 TextView tvphone;
   public ViewHolder(TextView v) {
            super(v);
tvName = (TextView) itemView.findViewById(R.id.name);
tvphone = (TextView) itemView.findViewById(R.id.phone)}}
   آماده سازی سازنده مناسب(متناسب با هر نوع داده)//
    public MyAdapter(Context mcontext ,List&lt; Friend &gt; friendList) { 
      this. friendList = friendList;
       This.context= mcontext;    }
//توسط layout managerمورد استفاده قرار ی گیرد
    @Override
    public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
     (ایجاد ویوی جدید)//
    TextView v = (TextView) LayoutInflater.from(parent.getContext())
    .inflate(R.layout.my_item_view, parent, false);
        ...
        ViewHolder vh = new ViewHolder(v);
        return vh;
    }
    // جایگزین کردن محتوای ویو ها ( استفاده می شودlayout managerتوسط )
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {   آیتم  مربوط به این پوزیشن را  از منبع داده میگیرد//     محتوای ویو را با این ایتم جایگزین میکند// 
final Friend contact =  friendList.get(position);
 holder.tvName.setText(contact.getname());
holder.tvphone.setText(contact.getPhone());
    }
   اندازه منبع داده را برمیگرداند//
    @Override
    public int getItemCount() {   return friendList.size();   }  }       ابتدا LayoutManager متد onCreateViewHolder  رو فراخوانی می کنه این متد برای ساختن RecyclerView.ViewHolder  و  تنظیم ویوهای مورد استفاده برای نمایش محتواها نیاز است.سپس LayoutManager  ویو را به داده هایش متصل می کند این کار را با فراخوانی متد onBindViewHolder انجام می دهد. این متد داده متناسب را آورده و در ویو موردنظر پر می کند. مثلا اگر ریسایکلر ویو لیستی از نام‌ها را نمایش می‌دهد  این متد نام متناسب را در  لیست پیدا می‌کند و آن را در Textviewی ViewHolder پر می کند.نتیجه این مثال هم مثل مثال قبلی به این شکل خواهد بود: اگر بخواهیم آیتم ها را بصورت افقی اسکرول کنیم در قسمت تعریف LayoutManager باید نحوه ی نمایش را horizontal انتخاب کنیم.به این شکل:LinearLayoutManager mylayoutManager = new LinearLayoutManager( this,LinearLayoutManager.HORIZONTAL,false );همونطور که می بینید ما یک لیست قابل پیمایش را از دو طریق می توانیم انجام دهیم.این بستگی دارد که واقعا چیکار میخواهیم بکنیم از یکی از ابزارهای ریسایکلر ویو یا بیست ویو استفاده می کنیمو حالا سوالی که پیش می‌آید این است که تفاوت بین لیست‌ویو و ریسایکلر‌ویو در چیست؟  ریسایکلرویو از یک ViewHolder برای ذخیره سازی رفرنس ها به ویوهای مرتبط استفاده می کند.  درنتیجه  باعث میشه تا ما کمتر از متد findviewbyid  استفاده کنیم.بنابراین ویوهلدر اجازه میدهد تا عملیات اسکرول لیستمان به آرامی اتفاق بیفتد و لیستمان  هنگام اسکرول گیر نکند (lag نزند) آداپترِ recyclerview  ما را مجبور میکند تا از الگوی viewholder استفاده کنیم پیداکردن و پرکردن ویوها و هم چنین به روزرسانی ویو‌ها از طریق متدهای onCreateViewHolder()  , onBindViewHolder() انجام میگیرد. از طرف دیگر در لیست ویو بدون پیاده سازی Viewholder لیست رو نمایش میدهیم ولی اسکرول در لیست به دلیل بارگذاری تمام داده ها در حافظه ناکارآمدتر خواهد بود.ریسایکلرویو از layout Manager برای تثبیت موقعیت آیتم ها (قرار دادن آیتم ها در مکان مناسب)استفاده میکند و همچنین این کلاس به ما امکانی برای انتخاب روشهایی میدهد که می خواهیم آیتم ها را نمایش دهیم. برای مثال اگر ما بخواهیم لیستمان را بصورت عمودی یا افقی اسکرول کنیم باید از LinearLayoutMsnager استفاده کنیم. , یا برای نمایش بصورت گرید از gridlayoutMaanger استفاده می کنیم.چیدمان و آرایش آیتم ها(itemDecoration) مثلا در ریسایکلر ویو بطور پیش فرض بین سطرها بخش جداکننده وجود ندارد اگر بخواهیم به دلایلی یک بخش جداکننده اضافه کنیم، می توانیم از DividerItemDecoration استفاده کنیم وآن را به RecyclerView اضافه کنیم. در صورتی که از ListView استفاده کنیم، ما باید خودمون آرایش ردیف ها را شکل دهیم. برای این ابزار کلاس کمک کننده دیگری مثل itemDecoration وجود ندارد.انیمیشن های پیش فرض(itemAnimator‌) برای ظاهر شدن یا ناپدید شدن لیست، اضافه کردن به recyclerview یا حذف کردن از آن. بطور پیش فرض انیمیشن لیست ریسایکلرویوها بسیار خوب و نرمه البته  با اینکه خیلی آسان نیست ما میتوانیم به انیمیشن مورد نظر خودمان تغییر دهیم. برای انجام راحت این کار میتوانیم از کلاس simpleritemAnimator ارث‌بری کنیم و متد های مورد نیازمان را پیاده سازی کنیم. این کار در لیست ویوو یچیده‌تر و سختتر انجام میگیرد.  در آداپتر ریسایکلر ویو متد هایی برای اعلان وجود دارد و برای عناصر متدهای خاص نیز وجود دارد مانند ()notifyItemInserted(), notifyItemRemoved یا ()notifyItemChanged بسته به این که چه اتفاقی در آیتم ها افتاده میتوانیم از آن ها  استفده کنیم در لیست ویو فقط می توانیم از notifyDataSetChanged استفاده کنیم و و مجبور هستیم خودمان آن را اداره کنیم.خلاصهلیست ویو برای مدت طولانی مورد استفاده قرار گرفته است و می توانستیم بیشتر موارد را با آن پوشش دهیم اما نیازهای کاربران در حال حاضر متفاوت هستند. طراحی لیست‌ها رفته‌رفته پیچیده‌تر می‌شود و لیست‌ویو برای این‌کار کمکی نمی کند. البته Material Design تغییرات خوب دیگری را ایجاد کرد اما پیچیده هست. خوشبختانه Recyclerview معرفی شد و مشکلات زیادی را حل کرده است. ریسایکلرویو به طور پیش‌فرض کارآمدتر هست انیمیشن های آن ساده تر است و طرح‌بندی آن آسان تر است بنابراین همیشه اگه در گیر هستید که از کدام یک از این ابزارها استفاده کنید حتما استفاده از recyclerview را در اولویت قرار دهید.</description>
                <category>Zahra Ghaffarpour</category>
                <author>Zahra Ghaffarpour</author>
                <pubDate>Tue, 24 Apr 2018 11:26:12 +0430</pubDate>
            </item>
                    <item>
                <title>از کجا آمده‌ام و به کجا می‌روم؟</title>
                <link>https://virgool.io/@zahragh/%D8%A7%D8%B2-%DA%A9%D8%AC%D8%A7-%D8%A2%D9%85%D8%AF%D9%87-%D8%A7%D9%85-%D8%A8%D9%87-%DA%A9%D8%AC%D8%A7-%D9%85%DB%8C-%D8%B1%D9%88%D9%85-ig9d7d65axb9</link>
                <description>سلام دوستانم،من زهرا هستم فارغ التصیل کارشناسی رشته فناوری اطلاعات(آی تی) از دانشگاه شهید مدنی آذربایجان.معمولا با اطرافیانم زود ارتباط برقرار میکنم و باهاشون صمیمی میشم و سعی میکنم یه نقطه مشترک بین خودمون پیدا کنم و سر صحبت رو باهاشون باز کنم اگر هم نقطه مشترکی وجود نداشت مشکلی پیش نمیاد اون سوال‌هایی که در مورد حرفه و شغل و یا درس و دانشگاه طرف مقابلم کنجکاوم بدونم رو میپرسم.تو دنیای واقعی این ارتباطات واقعی‌تر و محسوس‌تر هستند ولی الان یه دنیای دیگه به دنیاهامون اضافه شده به اسم دنیای مجازی! کاری به خوب و بد بودنش ندارم ولی میدونم بستری فراهم میکنه تا با میلیون ها نفر بتونی ارتباط داشته باشی که خیلی کارهای بزرگ و م‍ثبت میشه انجام داد. برا همین میخوام از این بستر  به خوبی استفاده کنم. شاید ارتباطات تو این فضا خیلی گسترده تر و متفاوت تر از دنیای واقعی باشه. چون در بستر این ارتباطات صرف نظر از هرگونه فاصله و مکان جغرافیایی میتونیم تجربه ها و دغدغه ها و تازه هایی که برای خودمون کشف کردیم رو  به اشتراک بگذاریم. در نتیجه  دوستان  عزیزم که وقتتون رو برای خوندن این مطلب میذارین دعوتتون میکنم به همراهی و هم کلامی. باشد که تو این مسیر برای هم مفید باشیم.دوران گذشته رو میخوام از چند سال قبل تعریف کنم...دوران دبیرستان که برای کنکور میخوندیم  هر کی با یه هدف و امیدی(دانشگاه خاص، رشته خاص... ) تلاششو میکرد بعضیام کلا تو این جو نبودن و هدف خاصی نداشتن. من جزو اون دسته بودم که میگفتم هرطوریه باید دانشگاه سراسری شهر خودم تو رشته مورد علاقه خودم و همون سال اول قبول بشم. این باید ها که برای خودم تعریف کرده بودم باعث فشار و استرس بیشتری میشد. بالاخره خوندم  و این غول بی سر و دم رو پشت سر گذاشتم. اوایل هیچ تصوری در مورد رشته ای که میخوام بخونم نداشتم. فقط چون تحت تاثیر اون جو کنکور بودم فکر میکردم حتما باید وارد دانشگاه بشم اونم دانشگاه سراسری. حالا رشته هم یکیش که رتبه ام برسه انتخاب میکنم. میتونم بگم که اصلا نمیدونستم به چی علاقه دارم؟؟ البته یه چیزایی در مورد ای تی به گوشم خورده بود که رشته جدیدیه و و بازار کارش خوبه و از این حرفا.... نهایتا طبق اون باید ها و نباید هایی که برا خودم تعیین کرده بودم خوشبختانه یا بدبختانه تو رشته شیمی کاربردی دانشگاه تبریز قبول شدم. علی رغم اینکه دانشگاهش خیلی برام ارزشمند بود همون اوایل ترم متوجه شدم هیچ علاقه ای به این رشته ندارم و همیشه کار با اعداد و ارقام برام لذت بخش تر بود و دانشگاه خوب و اساتید خوب تو این رشته برام راضی کننده نبود تا اینکه نهایتا تصمیم گرفتم رشتمو تغییر بدم. البته حرف از علاقه به آی تی که میزنم به معنی شناخت کامل رشته و استعدادخودم نبود. هر چی بود میدونستم حداقل از شیمی برام بهتره.وقتی وارد این رشته شدم یه تصور غلط که داشتم این بود که قراره هرچی در مورد کامپیوتر و اینترنته یاد بگیرم. رفته رفته که بیشتر با درس ها و مفاهیم اولیه برنامه نویسی اشنا شدم تازه فهمیدم برنامه نویسی  یعنی خلاقیت همراه با دانستن  راه وروش کاری که میخوای بکنی. بقیش به حالت نوشته درآوردن اون روش ها و دستورالعمل ها با الفبای برنامه نویسی هست.یواش یواش از سال بالایی ها و اساتید یه سری کلمات و مفاهیم به گوشم میخورد مثلا اچ‌تی‌ام‌ال . سی‌اس‌اس و بکِند و سی‌شارپ و وب و شبکه و .... چون اون اوایل فقط برنامه نویسی مقدماتی میدونستم فکر میکردم اینام یه چیزی شبیه به برنامه نویسی‌ان و شروع کردم به تحقیق. جوابی که از اطرافیانم تو این حوزه میشنیدم این بود که :&quot;تو یه زمینه که علاقه داری انتخاب کن و سعی کن تو اون زمینه مهارت  داشته باشی نه اینکه بخوای همشو یکجا بلد باشی و تو همش خبره بشی&quot;. سوالی که برام پیش میومد این بود که کدومش برا من خوبه؟ تو کدومش میتونم موفق باشم و استعدادشو دارم. از اچ‌تی‌ام‌ال و سی‌اس‌اس شروع کردم. رفته رفته که بیشتر میفهمیدم چی به چیه و اینا همونایی‌ان که فرانت‌اِند وب رو تشکیل میدن چیزایی که یاد میگرفتم برام ملموس‌تر میشد. با این حال مسیری که میخواستم برم برام مبهم بود و میگفتم خب بعدش چی؟ بقیش  چطور میشه. بعضی اوقات جوابایی که میگرفتم گیج کننده بود برا همین ترجیح میدادم خودم جوابامو پیدا کنم اینجوری چیزی که یاد میگرفتم بیشتر تو خاطرم میموند اون روزهای پرتلاطم و تقریبا بلاتکلیفم گذشت تا رسیدم به ترم ۴ و با امیرخان آشنا شدم. فکر میکنم مهم ترین نقطه‌ی عطف زندگیم بود و یه جورایی نقطه پرتاب بود. وقتی ایشون و امثال ایشون رو دیدم که میتونه از کار مربوط به رشته‌اش پول دربیاره و ادعایی داشته باشه خیلی امیدوار شدم و البته نگران که منم میتونم یا نه؟ به این نتیجه رسیدم خیلی اول راهم و باید تلاشمو خیلی بیشتر کنم. با پروژه‌های تستی که برا خودم ایجاد کردم شروع کردم به تمرین و قدم به قدم که پیش رفتم سوالات جدید برام پیش میومد که تو این برهه وب سایت  هایی مثل codecademy و w3schools خیلی برام مفید بودند و تونستم قدم به قدم یادبگیرم.بعدِ مدتی با وردپرس آشنا شدم و تونستم تا باهاش وب سایت راه اندازی کنم. بعضی هاش حتی پروژه‌ی واقعی بودن و تحویل مشتری دادیم. اینجا بود که نسبت به قبل اعتماد به نفسم خیلی بیشتر شد. ایمان آوردم اگه بخوای  کتری رو انجام بدی میتونی و راهشو پیدا میکنی. این مسیر رو هم تا یک سالی ادامه دادم ولی هنوز به ثبات نرسیده بودم و نمیدونستم میخوام چیکار کنم و به کجا برسم؟ و کدوم کاریه که از انجام دادنش اصلا خسته نمیشم و با دیدن نتیجش لذت میبرم؟ کم و بیش افرادی میدیدم و آشنا میشدم که برنامه نویسی اندروید انجام میدادن ولی فکر میکردم از همه اینایی که یاد گرفتم خیلی سخت‌تره و اونایی که میتونن برنامه نویسی اندروید انجام بدن باید خیلی خاص باشن و خیلی زمان زیادی گذاشتن و از اول اینکاره بودن و از این حرفا. تو این نقطه هم امیر خان نقش پرتابی خودش رو انجام داد و اون اعتماد به نفس رو به من دادن که نترس و برو جلو. الان وقت آزمون و خطاست و الانه که میتونی یاد بگیری و اشتباه کنی و دوباره یاد بگیری ولی شاید اگه این فرصت رو از دست بدی بعدا این فرصتو برای آزمون و خطا نداشته باشی.شروع کردم و الان کمتر از یک ساله بطور جدی برنامه نویسی اندروید انجام میدم و البته با ازمون و خطای خیلی زیاد و اشتباهات فراوان و کلی تجربه های جدید که هر لحظه‌اش برام شیرین و به یادموندنی هستن. هرچند که الانم معتقدم غیر از چیزایی که یاد گرفتم بقیش سخته. اونارم سعی میکنم رفته رفته برا خودم آسون کنم. به نظرم با این سرعتی که دنیای تکنولوژی در حال پیشرفته و هر نفر حداقل یه موبایل داره و نقش اون روز به روز تو زندگی عادی‌مون پررنگ‌تر میشه و این مساله باعث انگیزه بیشتر من به یادگیری برنامه نویسی موبایل میشه و الان  بزرگترین هدفم تو این زمینه اینه که همیشه قدرت یادگیری داشته باشم و از این یادگرفته‌ها به نحو احسن استفاده کنم و این دانش تبدیل به محصول به دردبخور بشه تا واقعا نیاز یا مشکلی رو حل کنه. امیدوارم  به اون جایگاه برسم و حرفی برای گفتن داشته باشم.سعی میکنم تو این بستری که فراهم شده هرچی که برام جالب بود و تازگی داشته و یاد گرفتم و از اشتباهات کوچیک و بزرگی که حین برنامه نویسی انجام میدم بگم. باور دارم با تجربه بیشتر همه این اشتباهاتم رفع خواهد شد و اشتباهات دیگر جای این اشتباهات رو خواهند گرفت. مسیر یادگیری از همین اشتباهات شروع میشه و باور دارم این مسیر هر چقدر هم سخت باشه قابل طی کردنه.سپاس از اینکه تا آخر خوندید.به امید همراهی.</description>
                <category>Zahra Ghaffarpour</category>
                <author>Zahra Ghaffarpour</author>
                <pubDate>Sun, 18 Feb 2018 23:13:54 +0330</pubDate>
            </item>
            </channel>
</rss>