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 に答える