1

我正在使用一个显示从assests文件夹加载的图像的gridView。改善gridview的滚动性能

gridview显示来自资产的50多个图像,但该gridview的性能非常差,并且滚动时间滞后。

的示例代码:

protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.ameme); 

    GridView myGallery = (GridView) findViewById(R.id.gridView1); 

    mBitArray = new Bitmap[5]; 

    //This is just a sample code 

    try 
    { 
     //these images are stored in the root of "assets" 
     mBitArray[0] = getBitmapFromAsset("AM0.jpg"); 
     mBitArray[1] = getBitmapFromAsset("AM1.jpg"); 
     mBitArray[2] = getBitmapFromAsset("AM2.jpg"); 
     mBitArray[3] = getBitmapFromAsset("AM3.jpg"); 
     mBitArray[4] = getBitmapFromAsset("AM4.jpg"); 
    } 
    catch (IOException e) 
    { 
     e.printStackTrace(); 
    } 

    myGallery.setAdapter(new GalleryAdapter(this, mBitArray)); 
} 
public class GalleryAdapter extends BaseAdapter 
    { 
     private Context mContext; 
     private Bitmap[] mImageArray; 

     public GalleryAdapter(Context context, Bitmap[] imgArray) 
     { 
      mContext = context; 
      mImageArray = imgArray; 
     } 

     public int getCount() 
     { 
      return mImageArray.length; 
     } 

     public Object getItem(int position) 
     { 
      return position; 
     } 

     public long getItemId(int position) 
     { 
      return position; 
     } 
     public View getView(int position, View convertView, ViewGroup parent) 
     { 
      final ImageView imgView = new ImageView(mContext); 


      imgView.setImageBitmap(mImageArray[position]); 

      final RelativeLayout borderImg = new RelativeLayout(mContext); 

      borderImg.setPadding(8, 8, 8, 8); 
      borderImg.setGravity(Gravity.CENTER | Gravity.BOTTOM); 
      borderImg.setBackgroundColor(Color.rgb(7,35,63)); 

      borderImg.addView(imgView); 
      imgView.setLayoutParams(new RelativeLayout.LayoutParams(100,100)); 

      return borderImg; 
     } 

    } 
private Bitmap getBitmapFromAsset(String strName) throws IOException 
    { 
     AssetManager assetManager = getAssets(); 

     InputStream istr = assetManager.open(strName); 

     Bitmap bitmap = BitmapFactory.decodeStream(istr); 
     istr.close(); 

     return bitmap; 
    } 
} 

如何让gridView()的滚动更流畅?

+0

通过不忽略'getView()'中的'convertView'来回收您的单元格开始。除此之外,使用Traceview来确定问题所在。 – CommonsWare 2014-12-13 14:41:52

+0

我是初学者。怎么做? – 2014-12-13 17:37:00

回答

0

ConvertView保存回收视图。你应该检查它是否为null。如果它不为空,则可以再次使用前一行。希望这段代码稍微改进一点。还有一种叫做ViewHolder的模式,它会很有用,但不适合你的情况。

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

     if(convertView == null){ 

     final ImageView imgView = new ImageView(mContext); 
     final RelativeLayout borderImg = new RelativeLayout(mContext); 

     imgView.setLayoutParams(new RelativeLayout.LayoutParams(100,100)); 
     borderImg.setPadding(8, 8, 8, 8); 
     borderImg.setGravity(Gravity.CENTER | Gravity.BOTTOM); 
     borderImg.setBackgroundColor(Color.rgb(7,35,63)); 

     borderImg.addView(imgView); 

     convertView.setTag(borderImg); 

    }else{ 
     borderImg = (RelativeLayout)convertView.getTag(); 
    } 

     imgView.setImageBitmap(mImageArray[position]); 

    return borderImg; 
} 

而且我猜的位图会很大,尝试读取这个http://developer.android.com/training/displaying-bitmaps/load-bitmap.html并对其进行优化。

+0

当我使用这个活动是强制关闭 – 2014-12-17 18:56:42