2

我有一个包含图像的列表,每次用户单击图像然后在网格视图上,图像将显示在网格视图上,这部分我已经完成并且它正在工作。问题是当用户开始向上/向下滚动时,网格上所有以前的图像开始显示在不同的位置。我猜我的适配器内的 getView 函数有问题

public class GridAdapter extends BaseAdapter{

Context mContext;
public GridAdapter(Context con){
    mContext = con;
}

@Override
public int getCount() {
    // TODO Auto-generated method stub
    return Globals.obsImageMatrix.size();
}

@Override
public Object getItem(int arg0) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public long getItemId(int position) {
    // TODO Auto-generated method stub
    return position;
}

@Override
public View getView(final int position, View convertView, ViewGroup arg2) {

     if(convertView==null){
        LayoutInflater vi = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = vi.inflate(R.layout.grid_image, null);
        Holder.image =(ImageView) convertView.findViewById(R.id.obsImage);
      //  Holder.image.setImageResource(R.drawable.blank);
     }
      Holder.image =(ImageView) convertView.findViewById(R.id.obsImage);
      Holder.image.setImageResource(Globals.obsImageMatrix.get(position));
    return convertView;
}



public static class Holder{
    public static ImageView image;
}

}

Globals.obsImageMatrix 是一个矩阵,它的大小与网格本身一样,包含网格的图像。

4

2 回答 2

3

您没有正确使用 ViewHolder。试试这个:

@Override
public View getView(final int position, View convertView, ViewGroup arg2) {

     ViewHolder holder = null;
     if(convertView==null){
        LayoutInflater vi = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = vi.inflate(R.layout.grid_image, null);
        holder = new ViewHolder();
        holder.image =(ImageView) convertView.findViewById(R.id.obsImage);
        convertView.setTag(holder);
     }else{
        holder = (ViewHolder)convertView.getTag(); 
     }

      holder.image.setImageResource(Globals.obsImageMatrix.get(position));
    return convertView;
}

public static class Holder{
    public ImageView image;
}

您必须阅读有关 viewHolders 的更多信息才能理解这种模式。SO和google上有很多帖子。

希望对你有帮助

于 2012-07-27T08:45:04.850 回答
0
  1. findViewById 应该仅在您创建新的视图时完成。
  2. 使用它作为你的 LayoutInflater 代替:

    Context mContext;
    
    Private LayoutInflater mInflater;
    
        public GridAdapter(Context con){
            mContext = con;
            mInflater = LayoutInflater.from(con);
    }
    

在您的 getView() 中:

@Override
public View getView(final int position, View convertView, ViewGroup arg2) {

     ViewHolder holder;
     if(convertView==null){
        convertView = mInflater.inflate(R.layout.grid_image, null);                 
        holder = new ViewHolder();
        holder.image =(ImageView) convertView.findViewById(R.id.obsImage);
        convertView.setTag(holder);
     }else{
        holder = (ViewHolder)convertView.getTag(); 
     }

      holder.image.setImageResource(Globals.obsImageMatrix.get(position));
    return convertView;
}


static class Holder{
    ImageView image;
}
于 2012-07-27T09:29:35.600 回答