با حمایت ما%۵
تخفیف بگیرد

logo-samandehi

برنامه نويسي اندرويد 14-استفاده از ListView ها و UI سطح متوسط

مقدمه:

استفاده از ListView ها و تعریف Adapter ها در نگاه اول بسیار دشوار است و معمولاً زمان زیادی از وقت آموزش بینندگان صرف ساخت اولین ListView آنها می شود که با کوچکترین تغییری هم ممکن است پایداری خود را از دست دهد.

در این آموزش هدف اصلی ساخت یک ListView در بهترین حالت خود است که به شما کمک می کند به راحتی در هر پروژه ای از آن استفاده کنید و کاملاً درست و دقیق کار خواهد کرد.

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

خاصیت دیگر و بسیار جذاب این آموزش استفاده شدن از تکنیک های سطح متوسط طراحی UI شامل طراحی Drawable ها است که بسیار در ظاهر برنامه اثر خواهد گذاشت. من هنرمند نیستم و ظاهر طراحی شده برای برنامه علی رقم تلاش برای زیبا بودن، این هدف را در بر نداشته و صرفاً آموزش بکارگیری تکنیک های UI مد نظر اینجانب بوده است. بنابراین در طراحی هنری ظاهر برنامه خود از یک هنرمند رابط گرافیک کمک بگیرید.

 

خروجی این جلسه :

 

 

پیاده سازی:

ابتدا فایلهای زیر را ایجاد یا کپی کنید.

محتویات فایل com.uncocoder.course.lessons.G.java :


  1. package com.uncocoder.course.lessons;

    import android.app.Application;
    import android.content.Context;
    import android.view.LayoutInflater;

    /**
     * این روش یک تکنیک مناسب برای مقدار دهی اولیه متغیرهای قابل دسترس، در تمام کلاسها
     * است. با استفاده از تعریف ثابت ها، تنظیمات و ... در یک جای مشخص مثل اینجا، همیشه همه چیز
     * به سادگی در دسترس و قابل تنظیم است
     * از طرفی این کلاس از کلاس اپلیکیشن زیر کلاس شده و در فایل منیفست به عنوان فایل کلاس
     * اصلی اپلیکشن شناسانده شده است. لذا با اجرای برنامه این کلاس شروع به کار می کند و اولین
     * جایی که می رود در متد تعریف شده زیر است
     */
    public class G extends Application {

        /** تعریف یک عبارت برای درج در لگ کت، که با سایر پروژه ها تداخل نداشته باشد */
        public static final String   LOG_TAG = "COURSE";

        /** تعریف اشاره گری به کانتکست که می تواند در بسیار از جاها مورد استفاده قرار گیرد نظیر نمایش تُست ها */
        public static Context        gContext;

        /**
         * تعریف اشاره گری به سرویسی که می تواند برای من یک نمونه از رابط گرافیک مربوط به فایلهای ایکس ام ال
         * را تولید کند. این سرویس برای استفاده از اداپتور لیست مورد استفاده قرار گرفته است
         */
        public static LayoutInflater gInflater;



        /**
         * با شروع برنامه از این مرحله کار آغاز می شود و پس از اتمام کارهای زیر، تازه به سراغ اکتیویتی اصلی
         * رفته و از آنجا ادامه می دهد
         */
        @Override
        public void onCreate() {
            super.onCreate();

            /** واریز کردن کانتکست برنامه در همان اوایل شروع برنامه جهت استفاده در همه کلاسهای نیازمند */
            gContext = getApplicationContext();

            /** پر کردن اشاره گر ( نمون ساز رابط گرافیک ) با گرفتن آن از سرویس های اندروید */
            gInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }
    }

 

محتویات فایل AndroidManifest.xml :




  1.     package="com.uncocoder.course.lessons"
        android:versionCode="1"
        android:versionName="1.0" >

       

                android:name="com.uncocoder.course.lessons.G"
            android:icon="@drawable/ic_launcher"
            android:label="Uncocoder Android Course"
            android:theme="@android:style/Theme.NoTitleBar" >
            
           
           
           
           
           
           
           
           
           
               
                   

                   
               

           

       

 

محتویات فایل com.uncocoder.course.lessons.listview.ActivityListView.java:


  1. package com.uncocoder.course.lessons.listview;

    import java.util.ArrayList;
    import android.app.Activity;
    import android.app.AlertDialog;
    import android.content.DialogInterface;
    import android.content.Intent;
    import android.net.Uri;
    import android.os.Bundle;
    import android.view.KeyEvent;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.view.ViewGroup;
    import android.widget.AdapterView;
    import android.widget.AdapterView.OnItemClickListener;
    import android.widget.ImageView;
    import android.widget.ListView;
    import com.uncocoder.course.lessons.R;

    /**
     * یک اکتیویتی جدید که نقطه شروع برنامه جدید خواهد بود. در تصاویر این همان اکتیویری است که شامل یک
     * هدر، فوتر و یک لیست داخل آن است. در منیفست این اکتیویری به عنوان شروع کننده برنامه ثبت و تنظیم
     * شده است
     */
    public class ActivityListView extends Activity {

        /**
         * برای عمل کردن به اصول کد نویسی و تمیزتر شدن کد، از تعریف یک ثابت برای انتخاب نام لیوت استفاده
         * می کنیم، چرا که در خواندن و ویرایش اکتویتی بسیار مفید خواهد بود.
         */
        private static final int           _RES_LAYOUT = R.layout.form_listview_sample;

        /* تعریف اشاره گرهای مورد نیاز جهت اتصال به رابط گرافیک */
        private ListView                   list_sample;
        private ViewGroup                  layout_header;
        private ImageView                  img_add;
        private ImageView                  img_clear_all;
        private ImageView                  img_information;

        /*
         * برای نمایش یک لیست از آیتم ها، نیاز به یک آرایه از آن جنس آیتم و یک آداپتور داریم که چگونگی استفاده از آن
         * در کلاسهای بعدی توضیح داده شده است. ولی به این طریق آرایه و آداپتور خود را مقدار دهی می کنید تا با هم
         * هماهنگ و قابل استفاده باشند. هر آداپتور نیاز به یک آرایه دارد و هر آرایه نیاز به یک ساختار دارد. از ساختار
         * تنظیم شده برای آرایه در آداپتور جهت نمایش آیتم ها استفاده می شود
         *
         * توجه داشته باشید که استراکچر را هم خودمان ساخته ایم و تقریباً برای هر اداپتر یک استراکچر هم نیاز است
         * ولی همیشه اینگونه نیست
         */
        private ArrayList _array      = new ArrayList();
        private AdapterSample              _adapter    = new AdapterSample(_array);



        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            /* چگونگی استفاده از ثابت تعریف کننده ریسورس لیوت */
            setContentView(_RES_LAYOUT);

            /* مقدار دهی اشاره گرهای رابط گرافیک و تعیین عملکرد آنها */
            initializeUi();

            /* این متد قرار است لیست را با آیتم های تستی پر کند که شامل 100 آیتم تست می باشد */
            fillSampleData();
        }



        /** این متد قرار است لیست را با آیتم های تستی پر کند که شامل 100 آیتم تست می باشد */
        private void fillSampleData() {
            for (int i = 0; i < 100; i++) {
                /* یک نمونه از استراکچر مورد نظر را ساخته، پارامترهای آن را پر می کنیم و به آرایه اضافه می کنیم */
                StructureSample sample = new StructureSample();
                sample.pTitle = "Title #" + i;
                sample.pDescription = "Long description for item #" + i;
                _array.add(sample);
            }

            /*
             * با استفاده از این متد ( در هسته اندروید ) به اداپتر می گوییم که تغییراتی وجود دارد و خود را با تغییرات به روز
             * کند، بنابراین آیتم ها در صفحه به درستی نمایش داده خواهند شد و اگر آیتم هایی تغییر کرده باشند، نمایش
             * لیست در صفحه به روز می شود. اما کدام لیست؟ در ادامه آموزش توضیح داده خواهد شد
             */
            _adapter.notifyDataSetChanged();
        }



        /** مقدار دهی اشاره گرهای رابط گرافیک و عملکرد آنها */
        private void initializeUi() {
            /* با همان روش گذشته کنترل مورد نظر را به رابط گرافیک متصل کرده ایم. این کنترل از جنس لیست است */
            list_sample = (ListView) findViewById(R.id.list_sample);

            /*
             * در اینجا لیست به اداپتر متصل می شود و با تغییر آرایه، اداپتر را بروز می کنیم و هر گاه اداپتر بروز شود به
             * طور خود کار لیست هم نمایش بروزی از آیتم ها نشان خواهد داد. این پاسخ سئوال بالا بود
             */
            list_sample.setAdapter(_adapter);

            /* باقی کنترل ها را به رابط گرافیک متصل کرده ایم */
            layout_header = (ViewGroup) findViewById(R.id.layout_header);
            img_add = (ImageView) findViewById(R.id.img_add);
            img_clear_all = (ImageView) findViewById(R.id.img_clear_all);
            img_information = (ImageView) findViewById(R.id.img_information);

            /* به شکلی که در زیر می بینید، می توانیم برای کلیک روی هر آیتم از لیست رخداد تعریف کنیم */
            list_sample.setOnItemClickListener(new OnItemClickListener() {

                @Override
                public void onItemClick(AdapterView appsAv, View view, int pos, long id) {
                    /*
                     * پوزیشن شماره آن آیتم در لیست است، بنابراین می توانیم مستقیماً از آرایه آن شماره را درخواست کنیم تا
                     * به نمونه ساخته شده در آن اسلات از لیست دست یابیم
                     */
                    StructureSample item = _array.get(pos);

                    /*
                     * این قسمت از کد جهت نمایش یک دیالوگ است که به آموزش لیست کاری ندارد و فقط نشان دهنده این است
                     * که می توانیم اطلاعات آن آیتم را چگونه بخوانیم و مورد استفاده قرار دهیم
                     */
                    AlertDialog.Builder builder = new AlertDialog.Builder(ActivityListView.this);
                    builder.setTitle("Item information:");
                    builder.setMessage("Item #" + pos + " Clicked" + "\n\nTitle: " + item.pTitle + "\nDesc: " + item.pDescription);

                    /* نحوه عملکرد دکمه اوکی و نوشته درون دکمه را تعریف می کنیم */
                    builder.setPositiveButton("OK", new AlertDialog.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            /* کلیک بر روی دکمه اوکی باعث بسته شدن دیالوگ می شود */
                            dialog.dismiss();
                        }
                    });

                    /* یک نمونه از دیالوگ را از سازنده دیالوگ ( که تنظیمش کردیم ) درخواست می کنیم و آنرا نشان می دهیم */
                    AlertDialog dialog = builder.create();
                    dialog.show();
                }
            });

            /*
             * تعریف می کنیم که با کلیک روی هدر پنجره به سایت مربوطه مراجعه کند. در اینصورت در صورتیکه تنها یک برازر
             * اینترنت روی گوشی نصب باشد، سایت مستقیماً باز خواهد شد، در غیر این صورت صفحه ای باز شده و از شما
             * نام برازر مورد علاقه تان را سئوال می کند و سپس سایت را نشان می دهد
             */
            layout_header.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.uncocoder.com"));
                    startActivity(browserIntent);
                }
            });

            /*
             * با کلیک روی این دکمه ( تصویر بجای دکمه استفاده شده ) پنجره جدیدی باز خواهد شد که ما آنرا ساخته ایم،
             * همانطور که متوجه تفاوتی خواهید شد و آنهم درخواست خروجی از این پنجره است و می گوییم آنرا برای
             * گرفتن یک نتیجه باز کن
             *
             * طرز کار به این شکل است که مانند باز کردن یک اکتیویتی جدید عمل می کند ولی یک عدد هم به آن
             * می فرستد. از آنجاییکه ممکن است اینگونه اکتیویتی هایی که خروجی دارند، چندین مدل دیتا از خود خارج کنند
             *
             * یا حتی در خارج کردن دیتا دچار مشکل شوند، با ارسال عدد مربوطه می گوییم که چه چیزی از آن می خواهیم
             * و در آینده هم با خواندن چیزی که توضیح داده خواهد شد، صحت دریافت اطلاعات را بررسی خواهیم کرد
             * اما اینکه کی به ما خبر داده می شود که این اکتیویتی برای ما نتیجه ای فرستاد که مورد استفاده قرار دهیم
             * در پایینتر توضیح داده شده است
             */
            img_add.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(ActivityListView.this, ActivityInputSample.class);
                    startActivityForResult(intent, ActivityInputSample.SAMPLE_DATA_ENTERED);
                }
            });

            /*
             * با استفاده از دکمه آرایه مربوطه را خالی می کنیم و می گوییم اداپتر خود را بروز کند که در اینصورت لیست
             * نمایش داده شده در صفحه خالی از هر آیتمی خواهد شد
             */
            img_clear_all.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    _array.clear();
                    _adapter.notifyDataSetChanged();
                }
            });

            /* باز هم برای تست دیالوگ یک نمونه دیگر از دیالوگ ساخته و برای زیبایی نمایش می دهیم */
            img_information.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    AlertDialog.Builder builder = new AlertDialog.Builder(ActivityListView.this);
                    builder.setTitle("Activity Information");
                    builder.setMessage("Made for test purpose");
                    builder.setPositiveButton("OK", new AlertDialog.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.dismiss();
                        }
                    });

                    AlertDialog dialog = builder.create();
                    dialog.show();
                }
            });

        }



        /**
         * اینجا همان جایی است که وقتی اکتیویتی که قرار است خروجی به ما بدهد، بسته می شود، برنامه به آن
         * هدایت خواهد شد. در آن اکتیویتی تعریف شده است که در صورت موفقیت چه علامتی با چه کلیدهایی خروجی
         * دهد
         */
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);

            /*
             * از آنجاییکه خودمان اکتیویتی را نوشته ایم می دانیم در صورتیکه مقدار خاصی در ریزالت کد قرار گرفت یعنی
             * اطلاعات درست خارج شده است و یا همان اطلاعاتی است که بدرد ما می خورد ( از بین انواع اطلاعات )
             * سپس به پردازش آن مشغول می شویم
             */
            if (resultCode == ActivityInputSample.SAMPLE_DATA_ENTERED) {

                /*
                 * چون خود ما اکتیویتی را نوشته ایم می دانیم که مقدار «تیتر» در کدام کلید و از چه نوعی است، و همینطور مقدار
                 * «توضیحات» در کدام کلید و از چه نوعی است. آنها را از پارامتر «دیتا» استخراج کرده و برای ساخت یک نمونه از
                 * استراکچر استفاده می کنیم. سپس مجدد اداپتر را بروز رسانی می کنیم
                 */
                String title = data.getExtras().getString(ActivityInputSample.TITLE);
                String desc = data.getExtras().getString(ActivityInputSample.DESC);
                _array.add(new StructureSample(title, desc));
                _adapter.notifyDataSetChanged();
            }
        }



        /** با استفاده از این می توانیم کنترل صفحه کلید سخت افزاری را در دست بگیریم */
        @Override
        public boolean onKeyDown(int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_BACK) {
                /* به برنامه دستور خروج کامل را خواهیم داد */
                System.exit(0);
                return true;
            }

            /* اگر ما دستوری برای صفحه کلید نداشتیم، کار خودش را بکند */
            return super.onKeyDown(keyCode, event);
        }
    }

 

محتویات فایل com.uncocoder.course.lessons.listview.StructureSample.java :


  1. package com.uncocoder.course.lessons.listview;

    /**
     * این استراکچر چیزی نیست جز یک کلاس ساده در برگیرنده فیلد که به ما در مرتب سازی کد با استفاده از
     * شیء گرایی کمک می کند
     */
    public class StructureSample {

        public String pTitle       = "";
        public String pDescription = "";



        /*
         * دو نوع کانستراکتور برای آن تعریف کرده ایم که هر گونه که خواستیم از آنها استفاده کنیم. کانستراکتور اول در
         * پر کردن 100 آیتم تستی استفاده شده است و دومی در پر شدن پس از گرفتن نتیجه از اکتیویتی ورود دیتا
         * که توضیح داده خواهد شد
         */

        public StructureSample() {

        }



        public StructureSample(String title, String description) {
            pTitle = title;
            pDescription = description;
        }
    }

 

محتویات فایل com.uncocoder.course.lessons.listview.ActivityInputSample.java :


  1. package com.uncocoder.course.lessons.listview;

    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.EditText;
    import com.uncocoder.course.lessons.R;

    /**
     * این اکتیویتی به آموزش لیست ارتباط خاصی ندارد، بلکه یک تکنیک است برای گرفتن اطلاعت و استفاده از آن و
     * چون این برنامه لیست محل مناسبی برای طرز کار آن بوده اینجا استفاده شده است
     *
     * پس از پایان یافتن این اکتویتی به اکتویتی صدا زننده می گوییم که دیتا جدیدی رسیده است و آن خود دیتا را
     * هندل می کند
     */
    public class ActivityInputSample extends Activity {

        /**
         * برای عمل کردن به اصول کد نویسی و تمیزتر شدن کد، از تعریف یک ثابت برای انتخاب نام لیوت استفاده
         * می کنیم، چرا که در خواندن و ویرایش اکتویتی بسیار مفید خواهد بود.
         */
        private static final int   _RES_LAYOUT         = R.layout.form_input_sample;

        /*
         * همانطور که می بینید کانست ( ثابت ) های زیر عمومی هستند چرا که در اکتیویتی لیست ( اکتیویتی اصلی )
         * هم مورد استفاده قرار گرفته اند
         */

        /**
         * با تعریف و استفاده این ثابت به این اکتیویتی می فهمانیم که چه نوع اطلاعاتی از آن می خواهیم ( اینجا فقط
         * یک نوع اطلاعات داریم بنابراین استفاده خاصی از آن نشده ). و همینطور در اکتیویتی صدا زننده مطمئن می شویم
         * که اطلاعات دست یافته صحیح هستند چون در این اکتیویتی اینگونه عمل شده که در صورت خروج اطلاعات صحیح
         * این عدد مجدد به بیرون پاس داده شود
         */
        public static final int    SAMPLE_DATA_ENTERED = 1;

        /** این هم کلید مربوط به اطلاعات «تیتر» است که در اکتویتی صدا زننده از آن برای گرفتن اطلاعات استفاده کردیم */
        public static final String TITLE               = "KEY_TITLE";

        /** این هم کلید مربوط به اطلاعات «توضیحات» است که در اکتویتی صدا زننده از آن برای گرفتن اطلاعات استفاده کردیم */
        public static final String DESC                = "KEY_DESC";

        /* تعریف اشاره گرهای مورد نیاز جهت اتصال به رابط گرافیک */
        private Button             btn_submit;
        private EditText           edt_title;
        private EditText           edt_description;



        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            /* چگونگی استفاده از ثابت تعریف کننده ریسورس لیوت */
            setContentView(_RES_LAYOUT);

            /* مقدار دهی اشاره گرهای رابط گرافیک و تعیین عملکرد آنها */
            initializeUi();
        }



        /** مقدار دهی اشاره گرهای رابط گرافیک و عملکرد آنها */
        private void initializeUi() {
            btn_submit = (Button) findViewById(R.id.btn_submit);
            edt_title = (EditText) findViewById(R.id.edt_title);
            edt_description = (EditText) findViewById(R.id.edt_description);

            /*
             * همانطور که کاملاً مشخص است با کلیک بر روی دکمه «سابمیت» اطلاعات از کنترل های مربوطه استخراج
             * گردیده، در کلید های مناسب ( که در بالا توضیح داده شد ) ذخیره شده، به اکتویتی گفته می شود که خروجی
             * خود را ست کند و در نهایت خود را می بندد
             *
             * به این طریق اگر این اکتیویتی برای درخواست خروجی صدا زده شده باشد، به اکتیویتی صدا زننده همانطور
             * که دیدید رویدادی صادر شده که اطلاعت رسید و قابل استفاده است
             */
            btn_submit.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    Intent intent = getIntent();
                    intent.putExtra(TITLE, edt_title.getText().toString());
                    intent.putExtra(DESC, edt_description.getText().toString());
                    setResult(SAMPLE_DATA_ENTERED, intent);
                    finish();
                }
            });
        }
    }

 

محتویات فایل com.uncocoder.course.lessons.listview.AdapterSample.java :


  1. package com.uncocoder.course.lessons.listview;

    import java.util.ArrayList;
    import android.graphics.Color;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.view.ViewGroup;
    import android.widget.ArrayAdapter;
    import android.widget.ImageView;
    import android.widget.TextView;
    import com.uncocoder.course.lessons.G;
    import com.uncocoder.course.lessons.R;

    /**
     * این کلاس، برای استفاده از لیست بسیار مهم است. در واقع یک اداپتر است یعنی متصل کننده چیزی از جنس
     * اطلاعات به چیزی که لیست آنرا به عنوان یک واسطه تأثیرگذار بر ظاهرش می فهمد. چگونگی این فهم را ما
     * باید تعریف کنیم به این شکل که اطلاعات را از استراکچر خوانده و در آیتم های لیست نشان می دهیم
     */
    public class AdapterSample extends ArrayAdapter {

        /**
         * برای عمل کردن به اصول کد نویسی و تمیزتر شدن کد، از تعریف یک ثابت برای انتخاب نام لیوت استفاده
         * می کنیم، چرا که در خواندن و ویرایش این کلاس بسیار مفید خواهد بود.
         */
        private static final int _RES_LAYOUT = R.layout.adapter_sample;



        /**
         * کافیست به این شکل کانستراکتور آنرا تعریف کنیم و در شرایط مختلف فقط نیاز است که نام استراکچر درون
         * پارامتر و نام لیوت را تغییر دهیم
         */
        public AdapterSample(ArrayList array) {
            super(G.gContext, _RES_LAYOUT, array);
        }



        /**
         * فرآیند استفاده از اداپتر بسیار گیج کننده است و نمونه سورس کدهای اینترنت هم هیچ کدام سعی در واضح
         * نمودن این فرآیند نکرده اند. با مثالی که برای شما تولید کرده ام هیچ نیازی به درک این شرایط پیچیده نخواهید
         * داشت و فقط کافیست که متد زیر را دقیقاً به همین شکل در هر کدام از اداپترهای برنامه خود قرار دهید و فقط
         * نام استراکچر مربوطه داخل آنرا عوض کنید. باقی کار در متد بعدی توضیح داده می شود
         *
         * اما برای اطلاعات بیشتر این را بدانید که برای اپتیمایز ( بهینه ) بودن لیست ( که ممکن است حتی 1000 آیتم )
         * را هم در بر داشته باشد، نمی توان مثلاً 1000 نمونه از رابط گرافیک آن ساخت و به لیست اضافه کرد چرا که حجم
         * زیادی از منابع گوشی مخصوصاً حافظه را تحت تأثیر قرار می دهد. در چنین شرایطی نسبت به ارتفاع هر گوشی
         * مثلا 3 تا 10 آیتم رابط گرافیک تولید می شود که به طور خودکار توسط هسته اندروید انجام می گیرد.
         *
         * در صورتیکه هر آیتم از لیست بالا خارج شود حذف و یک آیتم زیر لیست بوجود می آید و اگر هر آیتم از پایین لیست
         * خارج شود حذف و یک آیتم در بالای لیست بوجود می آید. این قسمت از کد به مدیریت این مساله مربوط می شود
         * که نیازی نیست خیلی در آن دقیق بشوید
         */
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder;

            StructureSample item = getItem(position);

            if (convertView == null) {
                convertView = G.gInflater.inflate(_RES_LAYOUT, parent, false);
                holder = new ViewHolder(convertView);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }

            holder.fill(this, item, position);
            return convertView;
        }



        /**
         * برای تمیز تر شدن کار بجای تعریف عناصر رابط گرافیک در خود کلاس، از یک کلاس استاتیک دیگر استفاده
         * می کنیم که مجموع اشاره گر های به رابط گرافیک را در بر داشته باشد. از طرفی مناسب است که نحوه
         * پر شدن و عملکرد این اشاره گر ها را هم در همین کلاس تعریف کنیم
         *
         * در متد بالا از متد «فیل» این کلاس استفاده شده است که باعث بروز شدن هر آیتم خواهد شد
         */
        private static class ViewHolder {

            /* تعریف اشاره گرهای رابط گرافیک */
            public ViewGroup layout_item;
            public TextView  txt_title;
            public TextView  txt_description;
            public ImageView img_remove;



            /**
             * متصل نبودن اشاره گرها به ریسورسهای رابط گرافیک. توجه کنید که این کانستراکتور در متد بالا مورد
             * استفاده قرار گرفته است و با ساخته شدن یک نمونه از این کلاس، مقادیر اختصاص می یابند
             */
            public ViewHolder(View view) {
                layout_item = (ViewGroup) view.findViewById(R.id.layout_item);
                txt_title = (TextView) view.findViewById(R.id.txt_title);
                txt_description = (TextView) view.findViewById(R.id.txt_description);
                img_remove = (ImageView) view.findViewById(R.id.img_remove);
            }



            /**
             * به پارامترهای ورودی کار خاصی نداریم و فقط کافیست که نام کلاس مربوطه در پارامتر ها را با کلاس آرایه خود
             * همخوان کنید. این متد برای پر کردن و مقدار دهی عناصر رابط گرافیک استفاده می شود.
             */
            public void fill(final ArrayAdapter adapter, final StructureSample item, final int position) {
                /* کنترل های تکست را با مقدار «تیتر» آیتم پر می کنیم */
                txt_title.setText(item.pTitle);
                txt_description.setText(item.pDescription);

                /*
                 * دلمان می خواهد یکی در میان، رنگ پشت هر آیتم کمی عوض شود ( سطر های زوج و فرد )
                 * به همین زیبایی این کار انجام خواهد شد
                 */
                if (position % 2 == 0) {
                    layout_item.setBackgroundColor(Color.parseColor("#06ffffff"));
                } else {
                    layout_item.setBackgroundColor(Color.parseColor("#10ffffff"));
                }

                /*
                 * دلمان می خواهد با کلیک روی دکمه «حذف» هر آیتم آنرا از لیست حذف کنیم. اما چون به خود اداپتر دسترسی
                 * داریم با حذف آن آیتم از اداپتر از لیست هم به طور خود کار حذف می شود و نیازی به بروز رسانی اداپتر نیست
                 */
                img_remove.setOnClickListener(new OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        adapter.remove(item);
                    }
                });
            }
        }

    }

 

محتویات فایل layout/form_listview_sample.xml :



  1.     android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="@drawable/page_background_repeat"
        android:orientation="vertical" >

                android:id="@+id/layout_header"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:background="#11ff00ff"
            android:orientation="vertical" >

                        android:layout_width="fill_parent"
                android:layout_height="48dip"
                android:layout_marginLeft="4dip"
                android:layout_marginRight="4dip"
                android:gravity="center"
                android:orientation="vertical"
                android:paddingBottom="4dip"
                android:paddingTop="4dip" >

                                android:layout_width="fill_parent"
                    android:layout_height="0dip"
                    android:layout_weight="1" >

                                        android:id="@+id/textView1"
                        android:layout_width="wrap_content"
                        android:layout_height="fill_parent"
                        android:gravity="center_vertical"
                        android:text="Android Course by:"
                        android:textColor="#aaaaaa"
                        android:textSize="14dip" />

           &n

مطالب مرتبط

آخرین شرکتهای طرف قرارداد

دارولند

طراحی فروشگاه اینترنتی

آف مکس

طراحی سایت تخفیف گروهی

نمایندگان بیمه ما

طراحی وب سایت و پورتال نمایندگان

پژند الکترونیک

طراحی وب سایت و پرتال

نمایندگی بوش

طراحی وب سایت شرکتی

ایران بزرگ

طراحی وب سایت، اتوماسیون اداری و خدمات شبکه پایگاه خبری ایران بزرگ

ستون فقرات تهران

طراحی پورتال تخصصی پزشکی ستون فقرات تهران

آخرین توییت ها

آخرین مقالات آموزشی

استفاده از تکنولوژی روز دنیا در شرکت فناوران راتا رایان