Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android gridview:显示大量图像时出错_Android_Android Gridview - Fatal编程技术网

Android gridview:显示大量图像时出错

Android gridview:显示大量图像时出错,android,android-gridview,Android,Android Gridview,我有一个网格视图,它是使用扩展BaseAdapter的自定义ImageAdapter类填充的。 图像从SD卡中的特定文件夹动态加载。我已经根据图片的位置(1.png、2.png等)给它们命名。我还为网格项设置了一个OnClickListener:从SD卡播放与图像同名的音频文件 当图像数量较少且适合在屏幕上显示时,它工作得很好 但当数字较大且图像不适合屏幕时,向下滚动屏幕显示的下一组行主要是前几行图像的重复,而不是对应位置的图像 我从logcat中发现,adapter类的getView()函数最

我有一个网格视图,它是使用扩展BaseAdapter的自定义ImageAdapter类填充的。 图像从SD卡中的特定文件夹动态加载。我已经根据图片的位置(1.png、2.png等)给它们命名。我还为网格项设置了一个
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;
}
  • 我填充了getItem,它不是100%需要的,但拥有它总是更好的。然后,适配器代码的其余部分就可以依赖它了
  • 每个条目的条目id都应该不同,您可以使用getItem(position).hashCode()(可能较慢),也可以只返回position(我在这里就是这么做的)
  • getView方法有点棘手。其思想是,如果convertView为null,则创建它。然后,在任何情况下,都可以设置视图的内容
  • getView项中的充气应该使用父视图作为父视图,并且“false”告诉系统不要将新视图添加到父视图中(gridview将处理该问题)。否则,某些布局参数可能会被忽略

  • 您拥有的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_内容”,并且不会尝试调整图像的大小。我倾向于认为,如果可能的话,您应该保留父版本、错误版本和“修复”布局。