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

来源:互联网 发布:淘宝反作弊部门情况 编辑:程序博客网 时间:2024/05/21 09:49

(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;




0 0