Android gridview:显示大量图像时出错
我有一个网格视图,它是使用扩展BaseAdapter的自定义ImageAdapter类填充的。 图像从SD卡中的特定文件夹动态加载。我已经根据图片的位置(1.png、2.png等)给它们命名。我还为网格项设置了一个Android gridview:显示大量图像时出错,android,android-gridview,Android,Android Gridview,我有一个网格视图,它是使用扩展BaseAdapter的自定义ImageAdapter类填充的。 图像从SD卡中的特定文件夹动态加载。我已经根据图片的位置(1.png、2.png等)给它们命名。我还为网格项设置了一个OnClickListener:从SD卡播放与图像同名的音频文件 当图像数量较少且适合在屏幕上显示时,它工作得很好 但当数字较大且图像不适合屏幕时,向下滚动屏幕显示的下一组行主要是前几行图像的重复,而不是对应位置的图像 我从logcat中发现,adapter类的getView()函数最
OnClickListener
:从SD卡播放与图像同名的音频文件
当图像数量较少且适合在屏幕上显示时,它工作得很好
但当数字较大且图像不适合屏幕时,向下滚动屏幕显示的下一组行主要是前几行图像的重复,而不是对应位置的图像
我从logcat中发现,adapter类的getView()
函数最初仅针对屏幕上可见的图像调用,向下滚动时,未正确调用该函数以获得更多位置
有时整组图像也会被重新排列。
为了正确显示大量图像,我应该做与网格视图的基本实现不同的事情吗?还有什么我必须处理的吗
编辑代码
我正在使用
tabGrid[i].setAdapter(new ImageAdapter(this,i));
这是映像适配器类
@Override
public int getCount() {
// fileNames is a string array containing the image file names : 1.png, 2.png etc
return fileNames.length;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
// I did not use this function
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View v;
if(convertView==null) {
LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = inflater.inflate(R.layout.grid_image, null);
ImageView iv = (ImageView)v.findViewById(R.id.icon_image);
String bitmapFileName = fileNames[position];
Bitmap bmp =(Bitmap)BitmapFactory.decodeFile(dir.getPath() + "/" + bitmapFileName);a
iv.setImageBitmap(bmp);
}
else {
v = convertView;
}
return v;
}
getItem()
和getItemId()
函数是否重要?目录和文件名都是有效的。这里有一个快速修复方法,应该更好
@Override
public String getItem(int position) {
return fileNames[position];
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v;
if(convertView==null) {
LayoutInflater inflater = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = inflater.inflate(R.layout.grid_image, parent, false);
}
else {
v = convertView;
}
ImageView iv = (ImageView)v.findViewById(R.id.icon_image);
String bitmapFileName = getItem(position);
Bitmap bmp =(Bitmap)BitmapFactory.decodeFile(dir.getPath() + "/" + bitmapFileName);a
iv.setImageBitmap(bmp);
return v;
}
您拥有的erorr是因为视图正在被回收(convertView非空),并且您没有为这些视图设置内容。希望有帮助 您是否有可能发布一些代码来查看可能出现的问题?:)@格雷戈里:谢谢你调查。我已经添加了代码。。dint添加最初的代码,因为qn变得太长
v=inflater.inflate(R.layout.grid\u image,parent,false)
使一些图片变小,但当我将其更改为v=inflater.inflate(R.layout.grid\u image,null)
正确显示的图像@Gregory@jerrin-george当使用“parent,false”时,它将使用布局宽度(和高度以及以“layout”开头的任何内容)来设置布局尺寸,而如果不使用,它可能会返回到“wrap_内容”,并且不会尝试调整图像的大小。我倾向于认为,如果可能的话,您应该保留父版本、错误版本和“修复”布局。