【问题标题】:grid view scrolling issue网格视图滚动问题
【发布时间】:2012-07-27 08:35:34
【问题描述】:

我有一个包含图像的列表,每次用户单击图像然后在网格视图上,图像将显示在网格视图上,这部分我已经完成并且它正在工作。 问题是当用户开始向上/向下滚动时,网格上所有以前的图像开始显示在不同的位置。我猜我的适配器中的 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 是一个矩阵,它的大小与网格本身一样,包含网格的图像。

【问题讨论】:

    标签: android view grid scroll


    【解决方案1】:

    您没有正确使用 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上有很多帖子。

    希望对你有帮助

    【讨论】:

    • 感谢您的快速回复
    【解决方案2】:
    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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多