1

如何提高我的 gridView 性能?滚动不流畅。

这是我的代码:

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

        View MyView;

        // Inflate the layout
        LayoutInflater li = ((Activity) MyContext).getLayoutInflater();

        MyView = li.inflate(R.layout.gallery_adapter, null);
        ImageButton imageFolders = (ImageButton) MyView.findViewById(R.id.folder);


        try {

            imageFolders.setImageBitmap(bMap);
            imageFolders.setOnClickListener(this);
            imageFolders.setId(products.get(position).getId());
        } catch (Exception e) {

        }

        MyView.setLayoutParams(70, 70);
        return MyView;
    }

我在这个 gridView 上有 200 张图像,但性能非常非常糟糕。

4

6 回答 6

4

你可以像这样修改你的代码:

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

    View MyView;

    if(convertView==null) 
    {
        // Inflate the layout
        LayoutInflater li = ((Activity) MyContext).getLayoutInflater();

        MyView = li.inflate(R.layout.gallery_adapter, null);
        ImageButton imageFolders = (ImageButton) MyView.findViewById(R.id.folder);


        try {

            imageFolders.setImageBitmap(bMap);
            imageFolders.setOnClickListener(this);
            imageFolders.setId(products.get(position).getId());
        } catch (Exception e) {

        }

        MyView.setLayoutParams(70, 70);
    }
    else
        MyView = convertView;
    return MyView;
}

已加载的图像将不会重新加载。你试过这种可能性吗?

于 2012-05-14T22:06:04.867 回答
0
public View getView(final int position, View convertView, ViewGroup parent){

    View MyView;
    ImageButton imageFolders;

    if(convertView==null){
        LayoutInflater li = ((Activity) MyContext).getLayoutInflater();
        MyView = li.inflate(R.layout.gallery_adapter, null);
     }else{
        MyView = convertView;
     }

     imageFolders = (ImageButton) MyView.findViewById(R.id.folder);

     try {
        imageFolders.setImageBitmap(bMap);
        imageFolders.setOnClickListener(this);
        imageFolders.setId(products.get(position).getId());
     } catch (Exception e) {}

     MyView.setLayoutParams(70, 70);
     return MyView;
}

我没有测试它,但试一试

于 2013-06-22T12:18:27.107 回答
0

做所有的布局修改,比如 textView.setText("text");在里面if(convertView == null)对我来说极大地提高了性能。

此外,如果您需要在Blocksuper.getView();之后立即调用它。if(convertView == null)

对于else部分return convertView

于 2015-07-09T11:20:31.573 回答
0
  1. 回收您的视图。膨胀布局并仅设置一次布局参数。
  2. 确保您没有从主线程上的磁盘/网络加载位图。
  3. 简化网格项目布局 (R.layout.gallery_adapter) 中的视图层次结构。
  4. 确保您的应用清单中未禁用硬件加速。
  5. 确保您没有过度绘制(在彼此之上绘制多个背景)。
于 2015-07-09T11:32:10.743 回答
0

最好的方法是:

  1. 在 CustomAdapter 的构造函数中初始化 Context、LayoutInflayer 和 Bitmaps(或 Drawables)

     private Context ctx;
     private int resource;
     private Bitmap[] bmps;
    
     private LayoutInflater inflater;
    
     MyCustomAdapter(Context ctx, Bitmap[] bmps) {
         this.ctx = ctx;
         this.bmps = bmps;
    
         this.resource = R.layout.gallery_adapter;
         this.inflater = LayoutInflater.from(ctx);
     }
    
  2. 如果不为空,则回收您的 convertView

     public View getView(final int position, View convertView, ViewGroup parent) {
         final ImageButton imgBtn;
    
         // Recycle convertView
         if (convertView == null) {
             imgBtn = (ImageButton) inflater.inflate(resource, null, false);
         } else {
             imgBtn = (ImageButton) convertView;
         }
    
         // Set Attributes
         imgBtn.setImageBitmap(bmps[position]);
         // imgBtn.setLayoutParams(70, 70); // Remove this and put it in your xml resource
    
         ...
    
         return imgBtn;
    

此代码假定您的 xml 资源 (R.layout.myImageButton) 如下所示:

<?xml version="1.0" encoding="utf-8"?>
<ImageButton xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/someId"
    android:layout_width="70dp"
    android:layout_height="70dp"
    ...
 />
于 2020-12-17T22:52:52.103 回答
-3

获取较低细节的图像,或获取更快的手机。
要么这样,要么对 gridview 进行编程,使图像仅在您开始看到它们时才加载。

于 2012-05-14T20:29:02.040 回答