کلیدستان

نسخه‌ی کامل: رفتار نرمال گرید ویو (به هم ریختگی item ها هنگام اسکرول)
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
سلام
وقت بخیر
من از یه گرید ویو سفارشی استفاده می کنم برای نمایش یک سری اطلاعات ، نام و عکس.
حدود 50-60 تا ایتم برای نمایش وجود داره، وقتی گرید ویو رو اسکرول می کنم رو به بالا یا پایین ، جای ایتم ها عوض میشه و همچنین ایتم های تکراری نمایش داده میشه

این رفتار گرید ویو نرمال هست یا مشکل از کد های من هست؟!
سلام.
مشکل از کدها می باشد. این مشکل، برای مواردی مثل ListView و GridView  که در آنها تعدادی item را با Adapter می سازیم، ممکن است پیش بیاید (هنگام کدنویسی غلط). 
این نکته را در کلید زیر شرح داده ایم و راه حل آن نیز بیان شده است :

کلید شماره 2961

(۱۳۹۴/۰۲/۲۳, ۰۱:۴۶ ب.ظ)'admin' نوشته: [ -> ]سلام.
مشکل از کدها می باشد. این مشکل، برای مواردی مثل ListView و GridView  که در آنها تعدادی item را با Adapter می سازیم، ممکن است پیش بیاید (هنگام کدنویسی غلط). 
این نکته را در کلید زیر شرح داده ایم و راه حل آن نیز بیان شده است :

کلید شماره 2961


 

ممنون من اون مقاله رو خوندم و اونطور که گفته :

پس اگر کدها را بر اساس شماره متناظر با item ها بنویسیم، دیگر وابسته به بالا و پایین رفتن در ListView نخواهند بود.

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

الان کد گرید ویو من این هست :

کد پی‌اچ‌پی:
public class CustomGrid extends BaseAdapter{
      private 
Context mContext;
      private final 
String[] web;
      private final 
int[] Imageid

        public 
CustomGrid(Context c,String[] web,int[] Imageid ) {
            
mContext c;
            
this.Imageid Imageid;
            
this.web web;
        }

        @
Override
        
public int getCount() {
            
// TODO Auto-generated method stub
            
return web.length;
        }

        @
Override
        
public Object getItem(int position) {
            
// TODO Auto-generated method stub
            
return null;
        }

        @
Override
        
public long getItemId(int position) {
            
// TODO Auto-generated method stub
            
return 0;
        }

        @
Override
        
public View getView(int positionView convertViewViewGroup parent) {
            
// TODO Auto-generated method stub
            
View grid;
            
LayoutInflater inflater = (LayoutInflatermContext
                
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            
            if (
convertView == null) {  
                
                
grid = new View(mContext);
                
grid inflater.inflate(R.layout.grid_itemnull);
                
TextView textView = (TextViewgrid.findViewById(R.id.textView1);
                
ImageView imageView = (ImageView)grid.findViewById(R.id.imageView1);
                
                
String tasvir "http://eydkojaberim.ir/mooyekhoob/tasavir/" Imageid[position] + ".jpg";
                
                
int loader R.drawable.a74;
                
ImageLoader imgLoader = new ImageLoader(mContext);
                
imgLoader.DisplayImage(tasvirloaderimageView);

                
textView.setText(web[position]);
                
            } else {
                
grid convertView;
            }
            
            return 
grid;
        }

کدهای تعیین منابع عناصر، بر اساس position هستند و بنابراین مشکلی ندارند. شما ساختار روش getView را همانند همان کلید تغییر بدهید. مثلا در آن کلید، به صورت زیر است :

کد پی‌اچ‌پی:
@Override
public View getView(int positionView convertViewViewGroup parent) {
        
LayoutInflater inflater = (LayoutInflatergetSystemService(Context.LAYOUT_INFLATER_SERVICE);
        
View row inflater.inflate(R.layout.list_itemparentfalse);
        
        
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 = (TextViewrow.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 = (ImageViewrow.findViewById(R.id.imageView1);
        
iv.setImageResource(image_res_ID);

        return 
row;


کاری با تعیین منابع برای عنصرها نداریم. منظورم این بخش می باشد :

کد پی‌اچ‌پی:
View row inflater.inflate(R.layout.list_itemparentfalse); 

در خط بالا، لایه متناظر با لایه گرافیکی item ها (در اینجا برابر R.layout.list_item) ذکر شده. شما هم نام ذکر شده در پروژه اندروید خود را بیابید.
همچنین بخش های اضافه کد خود را حذف کنید (آن بخش if و else) تا کامل مشابه مورد بالا (ساختار ذکر شده برای روش getView) شود.