GetView再次为最后一项返回0



我正在尝试显示网格视图的图像和文本。我正在从数据库中获取文本,并将其存储到ArrayList中以供以后使用。我正在从sd卡上获取图像并显示它。

我写的代码工作得很好,但问题是getView()参数位置不能正常工作位置从0开始,也以0结束。因此网格的最后一项与第一项相同。下面是我的代码

public class ImageAdapter extends BaseAdapter
    {
        private LayoutInflater inflater;
        public ImageAdapter()
        {
            // TODO Auto-generated constructor stub
            inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }
        @Override
        public int getCount() 
        {
            // TODO Auto-generated method stub
            return listMainProduct.size();
//          return arrGrpName.size();
        }
        @Override
        public Object getItem(int position) 
        {
            // TODO Auto-generated method stub
            return null;
        }
        @Override
        public long getItemId(int position) 
        {
            // TODO Auto-generated method stub
            return position;
        }
        @Override
        public View getView(int position, View convertView, ViewGroup parent) 
        {
            // TODO Auto-generated method stub
            ViewHolder holder = null;
            if(convertView == null)
            {
                holder = new ViewHolder();
                convertView = inflater.inflate(R.layout.album_item, null);
                holder.imgView = (ImageView)convertView.findViewById(R.id.thumbImage);
                holder.txtView = (TextView)convertView.findViewById(R.id.tv);
                holder.txtView.setText(arrGrpName.get(position).toString());
                //Log.v("Text ", "Text :- "+arrGrpName.get(position).toString());
            Log.v("Position ", "Position :- "+position);
                BitmapFactory.Options options=new BitmapFactory.Options();
                options.inSampleSize = 2;
                String path = "/mnt/sdcard/JS_Images";
                File imgFile = new File(path+"/"+arrImageName.get(position).toString()+".jpg");
//              Log.v("Path", ""+(path+"/"+arrImageName.get(position).toString())+".jpg");
                Bitmap myBitmap = null;
                if(imgFile.exists())
                {
                    myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath(),options);
//                  myBitmap = BitmapFactory.decodeFile(arrImageName.get(position),options);
                    holder.imgView.setImageBitmap(myBitmap);
                }
                else  
                {
                }
            }
            else
            {
                holder = (ViewHolder) convertView.getTag();
            }
        return convertView;
        }
    }
    class ViewHolder
    {
        ImageView imgView;
        TextView txtView;
    }

这是我的日志猫

08-16 12:40:45.614: V/Position(27928): Position :- 0
08-16 12:40:45.667: V/Position(27928): Position :- 1
08-16 12:40:45.687: V/Position(27928): Position :- 2
08-16 12:40:45.691: V/Position(27928): Position :- 3
08-16 12:40:45.710: V/Position(27928): Position :- 4
08-16 12:40:45.717: V/Position(27928): Position :- 5
08-16 12:40:45.723: V/Position(27928): Position :- 6
08-16 12:40:45.743: V/Position(27928): Position :- 7
08-16 12:40:45.746: V/Position(27928): Position :- 8
08-16 12:40:45.751: V/Position(27928): Position :- 0

相册.class

public class Album extends Activity 
{
    public static DataSource dataSource;
    private ImageAdapter adapter;
    List<getMainProduct> listMainProduct;
    List<getStyleMst> listStyleMst;
    /**
     * Array of Strings (for temp storage of data form Database)
     **/
    ArrayList<String> arrGrpName = new ArrayList<String>();
    ArrayList<String> arrImageName = new ArrayList<String>();
    ArrayList<String> arrGrpNo = new ArrayList<String>();
    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.album);
        dataSource = new DataSource(Album.this);
        listMainProduct = dataSource.getMainProductData();
        /**
         * Getting ImageFolder & ImageName from Database 
         **/
        for(int i = 1 ; i <= listMainProduct.size() ; i++)
        {
            String repImg = null;
            String StrIMGS = dataSource.getImageNameForAlbum(i);
            if(StrIMGS!=null)
            {
                repImg = StrIMGS.replaceAll("%20", " ");
            }
//          Log.v("ImageName ", ""+ StrIMGS);
            String StrFolder = dataSource.getImageFolderFromDB(i);
//          Log.v("FolderName ", ""+ StrFolder);
            Log.v("Path ", ""+ StrFolder+"/"+repImg);
            String Path = StrFolder+"/"+repImg;
            arrImageName.add(Path);
//          Log.v("IMG Size ", "Size :- "+arrImageName);
        }
        /**
         * Getting GroupName & GrpNo form Database
         **/
        for(int i = 0 ; i < listMainProduct.size() ; i++)
        {
            String strGrpName = listMainProduct.get(i).getGrpName();
            int intGrpNo = listMainProduct.get(i).getGrpNo();
            arrGrpName.add(strGrpName);
            Log.v("ArrName ", "ArrayText :- "+arrGrpName.toString());
            arrGrpNo.add(String.valueOf(intGrpNo));
            Log.v("ArrNo ", "ArrayTextNo :- "+arrGrpNo.toString());
        }

        GridView gridView = (GridView)findViewById(R.id.AlbumGrid);
        adapter = new ImageAdapter();
        gridView.setAdapter(adapter);
        /** 
         * When Grid Item Selected or Clicked 
         **/
        gridView.setOnItemClickListener(new OnItemClickListener() 
        {
            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) 
            {
                // TODO Auto-generated method stub
                Toast.makeText(Album.this, ""+arrGrpNo.get(position).toString(), Toast.LENGTH_SHORT).show();
                Intent i = new Intent(Album.this,Gallery.class);
                i.putExtra("GrpNo", arrGrpNo.get(position).toString());
                startActivity(i);
            }
        });
    }

请认真帮助,我不知道这里发生了什么,提前感谢

if(convertView==null)块中,只获取viewssetTag对它们的引用,在其他部分获取上一个标记。在其他之后应用所有其他东西

{
    holder = (ViewHolder) convertView.getTag();
}

进行以下更改并尝试

ViewHolder holder = null;
if(convertView == null)
{
    holder = new ViewHolder();
    convertView = inflater.inflate(R.layout.album_item, parent,false);
    holder.imgView = (ImageView)convertView.findViewById(R.id.thumbImage);
    holder.txtView = (TextView)convertView.findViewById(R.id.tv);
    convertView.setTag(holder);
 }
 else
 {
     holder = (ViewHolder) convertView.getTag();
 }
 holder.txtView.setText(arrGrpName.get(position).toString());
 //Log.v("Text ", "Text :- "+arrGrpName.get(position).toString());
 Log.v("Position ", "Position :- "+position);
 BitmapFactory.Options options=new BitmapFactory.Options();
 options.inSampleSize = 2;
 String path = "/mnt/sdcard/JS_Images";
 File imgFile = new File(path+"/"+arrImageName.get(position).toString()+".jpg");
 //Log.v("Path", ""+(path+"/"+arrImageName.get(position).toString())+".jpg");
 Bitmap myBitmap = null;
 if(imgFile.exists())
 {
     myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath(),options);
     //myBitmap = BitmapFactory.decodeFile(arrImageName.get(position),options);
     holder.imgView.setImageBitmap(myBitmap);
 }
 else  
 {
 }
 return convertView;

职位问题很正常,(我认为)谷歌在"listView的世界"讲座上谈到了这一点。当布局阶段需要额外的重新计算时,就会发生这种情况。这不是最后一项。

您可以做的是保持项目在viewHolder中的位置(始终,无论convertView的情况如何),并检查它是否与参数相同。如果是,只需返回视图即可。如果没有,则根据新位置用更新后的数据填充。

我在代码中发现的另一个问题是,只有convertView==null时才填充数据。

这是错误的。无论在什么情况下,您都需要使用convertView填充数据。仅当convertView为null时才替换它,并用视图填充其viewHolder,以避免不需要的findViewById调用。

最新更新