【问题标题】:ViewHolder GridView laggyViewHolder GridView 滞后
【发布时间】:2014-04-07 09:00:07
【问题描述】:

我第一次使用 ViewHolderGridView,我是 android/java 新手 与ImageView 相比,它的效果要好得多。

但我最大的问题是滚动很慢。 我有两个问题:

第一个:我能做些什么来提高性能? 第二个:我可以用BitmapWorkerTask/AsyncTask怎么用?

我尝试的是android:scrollingCache="false",因为每个人都在写,但似乎android:scrollingCache="true" 的性能对我来说要好一些。

代码:

布局

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
                  android:orientation="vertical"  
                  android:layout_width="fill_parent"  
                  android:layout_height="fill_parent"  
                  android:padding="10dp">  
    <ImageView android:id="@+id/ic_launcher"
    android:contentDescription="@string/desc"  
    android:layout_width="match_parent" 
    android:layout_height="match_parent"
    android:columnWidth="90dp"
    android:numColumns="4"
    android:verticalSpacing="10dp"
    android:horizontalSpacing="10dp"
    android:stretchMode="columnWidth"
    android:gravity="center"
    android:fastScrollEnabled="true"
    android:persistentDrawingCache="scrolling"
    android:scrollingCache="true"
    android:animationCache="false"
    android:smoothScrollbar="true"
    /> 

    </LinearLayout> 

图像适配器

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;



public class ImageAdapter extends BaseAdapter {
    private Context mContext;
    private LayoutInflater mInflater; 


    // Keep all Images in array about 600
    public Integer[] mThumbIds = {

};
// Constructor
    public ImageAdapter(Context c) {   
        mInflater = LayoutInflater.from(c);  
           mContext = c;
    }

    @Override
    public int getCount() {
        return mThumbIds.length;
    }

    @Override
    public Object getItem(int position) {
        return mThumbIds[position];
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }



 // create a new ImageView for each item referenced by the     
    public View getView(int position, View convertView, ViewGroup parent) {     
     ViewHolder holder;
       if (convertView == null) {  // if it's not recycled,     
             convertView = mInflater.inflate(R.layout.categorycontent, null);  
           convertView.setLayoutParams(new GridView.LayoutParams(130, 130));  
          holder = new ViewHolder();  
             holder.icon = (ImageView )convertView.findViewById(R.id.ic_launcher);  
             convertView.setTag(holder);  
         } else {  
             holder = (ViewHolder) convertView.getTag();

         }  
holder.icon.setAdjustViewBounds(true);  
holder.icon.setScaleType(ImageView.ScaleType.CENTER_INSIDE);     
holder.icon.setImageResource(mThumbIds[position]);  
return convertView;     
    }     
    class ViewHolder {  
        ImageView icon;  
    }  }

希望各位大侠给我一些建议:)

NewCodewithErrors

    }

    class ViewHolder {  
        ImageView icon;  
    } 

 // create a new ImageView for each item referenced by the     
    public View getView(int position, View convertView, ViewGroup parent) {     
     ViewHolder holder;
       if (convertView == null) {  // if it's not recycled,     
             convertView = mInflater.inflate(R.layout.categorycontent, null);  
           convertView.setLayoutParams(new GridView.LayoutParams(130, 130));  
          holder = new ViewHolder();  
             holder.icon = (ImageView )convertView.findViewById(R.id.ic_launcher);  
             convertView.setTag(holder);  
         } else {  
             holder = (ViewHolder) convertView.getTag();

         }  
holder.icon.setAdjustViewBounds(true);  
holder.icon.setScaleType(ImageView.ScaleType.CENTER_INSIDE);     
holder.icon.setImageResource(mThumbIds[position]);

//Here i have the errors:
//The constructor ImageAdapter.LoadImage() is undefine ImageAdapter.java
//The method execute(Integer...) in the type AsyncTask<Integer,Void,Bitmap> is not 
//applicable for the arguments (View) ImageAdapter.java

new LoadImage().execute(convertView);

return convertView;     
    }   


    private class LoadImage extends AsyncTask<Integer, Void, Bitmap> {

        private ImageView imv;

        public LoadImage(ImageView imv) {
            this.imv = imv;
        }

        @Override
        protected void onPostExecute(Bitmap result) {

            if (result != null && imv != null) {
                imv.setVisibility(View.VISIBLE);
                imv.setImageBitmap(result);
            } else {
                imv.setVisibility(View.GONE);
            }
        }

        @Override
        protected Bitmap doInBackground(Integer... params) {
            Bitmap bitmap = null;
            bitmap = BitmapFactory.decodeResource(mContext.getResources(),
                    params[0]);
            return bitmap;
        }

    }}

【问题讨论】:

  • 您正在 UI 中加载图像,这就是您的网格滚动滞后的原因..尝试在 Asynchtask 中加载它..
  • 代码对我来说似乎很好。我已经多次使用它,但我从未见过任何滚动滞后。能否请您更详细地解释一下这个问题。
  • 你能指导我怎么做吗?或者你知道一个好的教程或别的什么?谢谢@kalyanpvs
  • @skulldeath420 对给定的扭结稍作修改,您将获得stackoverflow.com/questions/7729133/…
  • @KKD 我正在制作和学习一个有 4 个标签(片段)和全屏活动的应用程序,我可以分享图像。在第一个选项卡上,我发布的代码是什么,我尝试了新的更好的解决方案,因为该 gridview 选项卡中有超过 600 张图片。图像加载是完美的,但如果我快速滚动,因为假设我想要一张来自 gridview 末尾的图片,它会冻结并滞后几秒钟,我不想要。如果我滚动真的很慢,性能不是很好但没关系...

标签: java android image gridview bitmap


【解决方案1】:

首先在您的适配器中获取内部类,例如..

private class LoadImage extends AsyncTask<Integer, Void, Bitmap> {

    private ImageView imv;

    public LoadImage(ImageView imv) {
        this.imv = imv;
    }

    @Override
    protected void onPostExecute(Bitmap result) {

        if (result != null && imv != null) {
            imv.setVisibility(View.VISIBLE);
            imv.setImageBitmap(result);
        } else {
            imv.setVisibility(View.GONE);
        }
    }

    @Override
    protected Bitmap doInBackground(Integer... params) {
        Bitmap bitmap = null;
        bitmap = BitmapFactory.decodeResource(mContext.getResources(),
                params[0]);
        return bitmap;
    }

}

并在上面调用它 return convertView

new LoadImage(holder.icon).execute(mThumbIds[position]);

【讨论】:

  • 我仍然有一个新的错误。我在我的问题中添加了新代码,也许你可以看到我做错了什么。
  • //构造函数ImageAdapter.LoadImage()未定义ImageAdapter.java //AsyncTask类型中的方法execute(Integer...) //不适用于参数(视图)ImageAdapter.java 我添加了上面的代码。
  • @skulldeath420 你有没有这样称呼过new LoadImage(holder.icon).execute(mThumbIds[position]);
  • 是的,它在工作,我没有看到 holder.icon 等等 :) 但它并不平滑,它仍然是一样的,现在图片在错误的地方我意味着您可以看到它正在加载新的,但这对我来说没问题。您对表演有其他想法吗?
  • @skulldeath420 不..这是唯一的解决方案..移动这两个 holder.icon.setAdjustViewBounds(true); holder.icon.setScaleType(ImageView.ScaleType.CENTER_INSIDE);进入 if(convertview==null) 块的内部
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-16
  • 1970-01-01
  • 2019-05-15
  • 1970-01-01
相关资源
最近更新 更多