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]);