Android GetView是否再次为最后一项返回0?
我正在尝试显示网格视图的图像和文本。我正在从数据库中获取文本,并将其存储到ArrayList中供以后使用。同样,我从sd卡上获取图像并显示它 我编写的代码运行良好,但问题是getView()参数位置无法正常工作位置以0开始,也以0结束。因此网格的最后一项与第一项相同。下面是我的密码Android GetView是否再次为最后一项返回0?,android,android-gridlayout,Android,Android Gridlayout,我正在尝试显示网格视图的图像和文本。我正在从数据库中获取文本,并将其存储到ArrayList中供以后使用。同样,我从sd卡上获取图像并显示它 我编写的代码运行良好,但问题是getView()参数位置无法正常工作位置以0开始,也以0结束。因此网格的最后一项与第一项相同。下面是我的密码 public class ImageAdapter extends BaseAdapter { private LayoutInflater inflater; public
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我的意思是你应该在你的答案中添加解释,以供将来的读者阅读,因为你所说的很重要我很想了解你的答案的相关性。谢谢你的回答,但我还是得到了第一个和最后一个项目相同的图片