Java ViewHolder GridView laggy

Java ViewHolder GridView laggy,java,android,image,gridview,bitmap,Java,Android,Image,Gridview,Bitmap,我第一次使用ViewHolder和GridView一起使用,我对android/java还是个新手 它比使用ImageView工作得更好 但我最大的问题是滚动太慢了。 我有两个问题: 第一:我能做些什么来提高性能? 第二个问题:我可以和它一起使用以及如何使用BitmapWorkerTask/AsyncTask 我尝试的是android:scrollingCache=“false”,因为每个人都在写,但使用android:scrollingCache=“true”,我的性能似乎要好一点 代码: 布

我第一次使用
ViewHolder
GridView
一起使用,我对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> 
我希望你们能给我一些想法:)

新代码错误

    }

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

    }}
}
类视图持有者{
图像视图图标;
} 
//为引用的每个项目创建新的ImageView
公共视图getView(int位置、视图转换视图、视图组父级){
视窗座;
如果(convertView==null){//如果它没有被回收,
convertView=mInflater.inflate(R.layout.categorycontent,null);
setLayoutParams(新的GridView.LayoutParams(130130));
holder=新的ViewHolder();
holder.icon=(ImageView)convertView.findViewById(R.id.ic_启动器);
convertView.setTag(支架);
}否则{
holder=(ViewHolder)convertView.getTag();
}  
holder.icon.setAdjustViewBounds(真);
holder.icon.setScaleType(ImageView.ScaleType.CENTER_内);
holder.icon.setImageResource(mThumbIds[position]);
//这里我有一些错误:

//构造函数ImageAdapter.LoadImage()是未定义的ImageAdapter.java //类型AsyncTask中的方法execute(Integer…)不正确 //适用于参数(视图)ImageAdapter.java 新建LoadImage().execute(convertView); 返回视图; } 私有类LoadImage扩展了异步任务{ 私有ImageView imv; 公共加载映像(ImageView imv){ this.imv=imv; } @凌驾 受保护的void onPostExecute(位图结果){ 如果(结果!=null&&imv!=null){ imv.setVisibility(View.VISIBLE); imv.setImageBitmap(结果); }否则{ imv.setVisibility(View.GONE); } } @凌驾 受保护位图doInBackground(整数…参数){ 位图=空; 位图=BitmapFactory.decodeResource(mContext.getResources(), 参数[0]); 返回位图; } }}
首先在适配器中使用内部类,如

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中加载它。代码对我来说很好。我已经使用过多次,但我从未见过任何滚动滞后。你能更详细地解释一下这个问题吗?你能指导我怎么做吗?或者你知道一个好的教程或者别的什么吗?thx@kalyanpvs@skulldeath420通过对给定的扭结进行小的修改,您将在一个包含4个标签(片段)和fullscreenactivity的应用程序上获得@KKD I'm making和learning,因为我可以共享图像。在第一个选项卡上,我发布的代码是什么?我尝试了新的更好的解决方案,因为gridview选项卡中有600多张图片。图像加载是完美的,但是如果我快速滚动,因为我想从gridview的末尾看到一张图片,它会冻结并延迟几秒钟,这是我不想看到的。如果我的滚动速度真的很慢,性能不是很好,但还好…我仍然有一个新的错误相同。我在我的问题中添加了新代码,也许您可以看到我做错了什么。//构造函数ImageAdapter.LoadImage()是Unfine ImageAdapter.java//类型AsyncTask中的方法execute(Integer…)不//适用于参数(View)ImageAdapter.java//我添加了上面的代码。@skulldeath420您是否像这样调用了新的LoadImage(holder.icon).执行(mThumbIds[position]);是的,它在工作,我没有看到holder.icon等等:)但是它不平滑,它仍然是一样的,现在图片放在错误的地方,我的意思是你可以看到它正在加载新的图片,但这对我来说没有问题。您对性能有其他想法吗?@skulldeath420没有..这是唯一的解决方案..并移动这两个支架。icon.setAdjustViewBounds(true);holder.icon.setScaleType(ImageView.ScaleType.CENTER_内);进入if(convertview==null)块内部
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;
    }

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