簡體   English   中英

如何提高 gridview 性能 (android)

[英]How to improve gridview performance (android)

如何提高我的 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 張圖片,但性能非常非常糟糕。

你可以像這樣修改你的代碼:

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

已加載的圖像將不會重新加載。 你試過這種可能性嗎?

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

我沒有測試它,但試一試

做所有的布局修改,比如textView.setText("text"); if(convertView == null)內部極大地提高了我的性能。

另外如果你需要調用super.getView(); if(convertView == null)塊之后立即調用它。

對於else部分return convertView

  1. 回收您的視圖。 膨脹布局並只設置一次布局參數。
  2. 確保您沒有在主線程上從磁盤/網絡加載位圖。
  3. 簡化網格項布局 (R.layout.gallery_adapter) 中的視圖層次結構。
  4. 確保您的應用清單中沒有禁用硬件加速。
  5. 確保您沒有過度繪制(在彼此之上繪制多個背景)。

最好的辦法是:

  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"
    ...
 />

獲取較低細節的圖像,或獲得更快的手機。
或者,或者以這樣一種方式對 gridview 進行編程,即僅在您開始看到它們時才加載圖像。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM