Android GetView是否再次为最后一项返回0?

Android GetView是否再次为最后一项返回0?,android,android-gridlayout,Android,Android Gridlayout,我正在尝试显示网格视图的图像和文本。我正在从数据库中获取文本,并将其存储到ArrayList中供以后使用。同样,我从sd卡上获取图像并显示它 我编写的代码运行良好,但问题是getView()参数位置无法正常工作位置以0开始,也以0结束。因此网格的最后一项与第一项相同。下面是我的密码 public class ImageAdapter extends BaseAdapter { private LayoutInflater inflater; public

我正在尝试显示网格视图的图像和文本。我正在从数据库中获取文本,并将其存储到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
专辑类

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);
            }
        });
    }
公共类相册扩展活动
{
公共静态数据源;
专用图像适配器;
列出产品清单;
列表样式mst;
/**
*字符串数组(用于数据表单数据库的临时存储)
**/
ArrayList arrGrpName=新的ArrayList();
ArrayList arrImageName=新建ArrayList();
ArrayList arrGrpNo=新的ArrayList();
@凌驾
创建时受保护的void(Bundle savedInstanceState)
{
//TODO自动生成的方法存根
super.onCreate(savedInstanceState);
setContentView(R.layout.album);
dataSource=新数据源(Album.this);
listMainProduct=dataSource.getMainProductData();
/**
*从数据库获取ImageFolder和ImageName
**/
对于
if(convertView==null)
块中的(int i=1;i只需获取
视图的引用
setTag
,在其他部分获取上一个标记。在其他部分之后应用所有其他内容

{
    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;

位置问题是正常的,(我认为)谷歌在“”讲座上谈到了它。当版面设计阶段需要额外的重新计算时,就会发生。这不是最后一项

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

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


这是错误的。无论convertView的情况如何,都需要填充数据。只有当convertView为null时,才替换它,并用视图填充它的viewHolder,以避免在if(convertView==null)中不需要调用findViewById。

块只获取视图的引用并对其设置标记,在else部分获取上一个标记。在else{holder=(ViewHolder)convertView.getTag();}之后应用所有其他内容如我的回答所示。如你所见,我正在显示文本和图像。你的代码首先解决了文本和静态图像显示的问题item@kettu但我还是得到了第一个和最后一个项目的相同图像。文本不同我不知道y?@kettu我的意思是你应该在你的答案中添加解释,以供将来的读者阅读,因为你所说的很重要我很想了解你的答案的相关性。谢谢你的回答,但我还是得到了第一个和最后一个项目相同的图片