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

时间:2011-07-01 06:46:15

标签: android android-gridview

我有一个网格视图,使用扩展BaseAdapter的自定义ImageAdapter类填充。 图像是从SD卡中的特定文件夹动态加载的。我根据他们的帖子(1.png,2.png等)命名了图像。我还为网格项设置了OnClickListener:从SD卡播放了与图像同名的音频文件。

当图像数量较少且适合屏幕时效果很好。

但是当数字很大且图像不适合屏幕时,通过向下滚动屏幕显示的下一组行主要是重复前几行的图像而不是相应位置的图像。

我从logcat中发现,适配器类的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()功能是否重要?目录和文件名都有效。

1 个答案:

答案 0 :(得分:5)

这是一个应该更好的快速解决方案。

@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;
}
  1. 我填写了getItem,它并非100%需要,但拥有它总是更好。然后,其余的适配器代码可以依赖它
  2. 每个条目的项ID应该不同,你可以使用getItem(position).hashCode()(可能更慢)或只返回位置(我在这里做)。
  3. getView方法有点棘手。我们的想法是,如果convertView为null,则创建它。然后,在每种情况下,您都可以设置视图的内容。
  4. getView项目中的inflate应该使用parent作为父项,而“false”则告诉系统不要将新视图添加到父项(gridview将负责这一点)。如果不这样做,可能会忽略某些布局参数。
  5. 你的erorr是因为视图被回收(convertView not null)并且你没有为那些设置内容。希望有所帮助!