2

我有一个使用扩展 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()功能重要吗?目录和文件名都是有效的。

4

1 回答 1

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 为空,则创建它。然后,在每种情况下,您都设置视图的内容。
  4. getView 项中的 inflate 应该使用父级作为父级,并且“false”是为了告诉系统不要将新视图添加到父级(gridview 会处理)。如果不这样做,某些布局参数可能会被忽略。

您遇到的错误是因为视图被回收(convertView not null)并且您没有为它们设置内容。希望有帮助!

于 2011-07-04T07:57:35.820 回答