Gallery重写baseadapter时getView函数中的view重用

(1)基本方法:

链接1:点击打开链接

代码摘抄:

public View getView(int position, View convertView, ViewGroup parent) {    
            ImageView i = new ImageView(mContext);    
    
            i.setImageResource(mImageIds[position]);    
            i.setScaleType(ImageView.ScaleType.FIT_XY);    
           i.setLayoutParams(new Gallery.LayoutParams(136, 88));    
     
            // The preferred Gallery item background    
            i.setBackgroundResource(mGalleryItemBackground);    
     
            return i;    
        } 
链接二: BaseAdapter中重写getview的心得以及发现convertView回收的机制

public View getView(int position, View convertView, ViewGroup parent)  
    {  
         System.out.println("getView " + position + " " + convertView);//调试语句  
         Holder holder;  
        if(null==convertView)  
        {  
            holder=new Holder();  
            convertView=LayoutInflater.from(mContext).inflate(R.layout.textview, null); //mContext指的是调用的Activtty  
            holder.textView=(TextView)convertView.findViewById(R.id.textview);  
            convertView.setTag(holder);  
        }  
        else  
        {  
            holder=(Holder)convertView.getTag();  
        }  
        holder.textView.setText("position: "+position);  
            return convertView;           
    }  
    class Holder  
    {  
        public TextView textView;  
  
    } 


 
 

(2)循环重用

链接:点击打开链接

代码摘抄:

 public SmallGameVO[] featuredItems;
 
    private SmallGameVO tempGame;
 
    private View[] viewArray;
 
    public FeaturedAdapter(Context c, SmallGameVO[] featuredGames) {
 		featuredItems = featuredGames;
 		viewArray =  new View[featuredItems.length];
    }
 
    public int getCount() {
        return featuredItems.length;
    }
 
    public Object getItem(int position) {
        return position;
    }
 
    public long getItemId(int position) {
        return position;
    }
 
 
    public View getView(int position, View convertView, ViewGroup parent) {	   	
  		LayoutInflater linflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);			
  		LinearLayout tempView = null;
 
                if(convertView != null){
    		        NVDebug.log("re-using the convertView!");
    		        tempView = convertView;
    	        }else{
                        //no convertView, need to do the heavy lifting ourselves
                        //check our viewArray to see if we have a view at the position or we need to create a new one
 
				if(viewArray[position] != null){					
					tempView = (LinearLayout) viewArray[i];
					break;					
				} else {					
					tempView = (LinearLayout) linflater.inflate(R.layout.feature_gallery_capsule, null);
					viewArray[position] = tempView;
					break;					
				}
			}	
    	         }
 
    	        NVWebImageView img = (NVWebImageView) tempView.findViewById(R.id.galleryImage);
 
		if(position <= featuredItems.length - 1){			
			tempGame = featuredItems[position];
			if(img.imageUrl != tempGame.getFeaturedImage()){
				img.setImageUrl(tempGame.getFeaturedImage());
				img.loadImage();
			}		
		}else{
			tempView = new LinearLayout(parent.getContext());
		}    	
 
        return tempView;
    }

(3)缓存

链接:点击打开链接

代码摘抄:

public View getView(int position, View convertView, ViewGroup parent) {
    int arrPosition = position % VIEW_CHACHE_SIZE;
    ImageView imageView;
    mCursor.moveToPosition(position);
    if (parent.getHeight() > 0 && layoutParams.height == 0) {
        layoutParams = new Gallery.LayoutParams(parent.getWidth() / VISIBLE_IMAGES_COUNT, (int) (parent.getHeight() * IMAGE_HEIGHT_COEFICIENT));
        viewsList[0].setLayoutParams(layoutParams);
    }
    if (convertView != null) {
        Log.i("GALLERY", "convert view not null");
    }
    // check views cache
    if (viewsList[arrPosition] == null) {
        imageView = new ImageView(mContext);
        imageView.setPadding(3, 3, 3, 3);
        viewsList[arrPosition] = imageView;
    } else {
        imageView = viewsList[arrPosition];

        if (position == arrPosition) {
            if (imageView.getDrawable().equals(imagesList.get(position))) {
                return imageView;
            }
        }
    }
    // check images cache
    if (imagesList.get(position) != null) {
        imageView.setImageDrawable(imagesList.get(position));
    } else {
        byte[] photo = mCursor.getBlob(mCursor.getColumnIndex(DataProxy.PHOTO_COLUMN));
        imagesList.put(position, new BitmapDrawable(BitmapFactory.decodeByteArray(photo, 0, photo.length)));
        imageView.setImageDrawable(imagesList.get(position));
    }
    imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
    imageView.setLayoutParams(layoutParams);


    return imageView;
}

      .........................................................

    private SparseArray<Drawable> imagesList = new SparseArray<Drawable>();
private ImageView[] viewsList = new ImageView[VIEW_CHACHE_SIZE];
private Gallery.LayoutParams layoutParams = new LayoutParams(0, 0);
private static final int VIEW_CHACHE_SIZE = 4;

(4)自己最终解决方案

本文对链接 ZPhotoEngine图像算法引擎V3.0 给出android Demo进行扩展实现了给出的106种滤镜算法。

因为自己在Gallery中展示的是TextView,所以对方案三做了稍微的改动,(也许使用ListView会更方便,本人菜鸟,莫怪~)代码如下:

public View getView(int position, View convertView, ViewGroup parent){
        int arrPosition = position % VIEW_CHANCHE_SIZE;
        TextView textView;
        if(viewlist[arrPosition] == null){
            textView = new TextView(mContext);
            textView.setTextColor(Color.RED);
            textView.setBackgroundColor(Color.alpha(1));
            textView.setLayoutParams(new Gallery.LayoutParams(400, 150));
            viewlist[arrPosition] = textView;
        }else{
            textView = viewlist[arrPosition];
        }
        textView.setText(mFilterlist[position]);

        return textView;
    }

    private TextView[] viewlist = new TextView[VIEW_CHANCHE_SIZE];
    private static final int VIEW_CHANCHE_SIZE = 6;


 
 
Gallery重写baseadapter时getView函数中的view重用_第1张图片

你可能感兴趣的:(Adapter,gallery,getView,滤镜,convertView)