آموزش برنامه نویسی اندروید (Android)
۴۱۹ آموزش
نمایش دسته بندی ها (۴۱۹ آموزش)

دلیل به هم ریختگی ظاهر item های ListView هنگامی که کدها را بر اساس متغیر position در روش getView نمی نویسیم (مستقل بودن کدها از شماره item ها ، در روش getView که در Adapter مربوط به ListView نوشته می شود)

یکی از مواردی که ممکن است با آن برخورد کرده باشید، این است که هنگامی که به بالا و پایین ListView می رویم، ظاهر item های ListView به هم می ریزد (البته این مورد، کاملا به نوع کدها وابسته است). دلیل این مسئله این است که ما در روش getView که در Adapter مربوط به ListView تعریف می کنیم، کدها را مستقل از متغیر position می نویسیم. برای درک بهتر این موضوع، به ساختار یک Adapter دلخواه برای ListView توجه کنید :


private class MyAdapter extends ArrayAdapter<String>{

        public MyAdapter(Context context, int resource, int textViewResourceId,
                                        String[] strings) {
                super(context, resource, textViewResourceId, strings);
                // TODO Auto-generated constructor stub
        }
       
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
                View row = convertView;        
                if (row == null) {
                        LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                        row = inflater.inflate(R.layout.list_item, parent, false);
                }
               
                String stringName = "string_key_" + String.valueOf(position+1);
                int string_res_ID = getResources().getIdentifier(stringName,"string",getPackageName());
                String my_string = getResources().getString(string_res_ID);
                TextView tv = (TextView) row.findViewById(R.id.textView1);
                tv.setText(my_string);
               
                String imageName = "key_" + String.valueOf(position+1);
                int image_res_ID = getResources().getIdentifier(imageName,"drawable",getPackageName());
                ImageView iv = (ImageView) row.findViewById(R.id.imageView1);
                iv.setImageResource(image_res_ID);

                return row;
        }
               
               
}

در کد بالا، روش getView به صورت کلی زیر تعریف شده است :


public View getView(int position, View convertView, ViewGroup parent) {

در کد بالا، متغیر position ، حاوی شماره متناظر با item می باشد و بنابراین اگر قصد داریم که item ها دارای ظاهر متفاوتی باشند، باید مشخصات آنها را بر اساس متغیر position تعیین کنیم.

اما اکنون توضیح بدهیم که اصلا چرا اگر مشخصات به متغیر position وابسته نباشد، با بالا و پایین رفتن در ListView ، ظاهر item ها دوباره تغییر می یابد و به هم می ریزد. هنگامی که روش getView را برای ساخت item های ListView به کار می بریم، تنها item هایی که در صفحه قابل مشاهده می باشند، نگه داشته می شوند و سایر item هایی که قبلا ساخته شده اند، اگر دیگر در صفحه قابل دیدن نباشند، نگه داشته نمی شوند (منطقی است، زیرا شاید تعداد item ها خیلی زیاد باشد و نگه داشتن آنها، مشکلاتی را به وجود بیاورد). مثلا ما از ابتدای ListView شروع به پایین رفتن می کنیم، بنابراین تعدادی از Item هایی که از آنها عبور می کنیم و دیگر دیده نمی شوند، نگه داشته نمی شوند، پس اگر دوباره به ابتدای ListView برویم، آن item ها دوباره بر اساس کدهای روش getView ساخته خواهند شد. بنابراین مشکل از همینجا ایجاد می شود. پس اگر کدها را بر اساس شماره متناظر با item ها بنویسیم، دیگر وابسته به بالا و پایین رفتن در ListView نخواهند بود.

علاوه بر نکته بالا، باید این بخش از روش getView نیز به درستی کدنویسی شده باشد (ساختار آن مشابه کد زیر باشد) :


View row = convertView;        
if (row == null) {
        LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        row = inflater.inflate(R.layout.list_item, parent, false);
}