我知道以前有人问过这个问题,我也尝试过这些解决方案,但没有帮助。项目在第9个项目之后不断重复。这是我的密码。
@Override public View getView(int position, View convertView, ViewGroup parent)
{
ViewHolder holder;
if (convertView == null)
{
convertView = mInflater.inflate(R.layout.tile_company, null);
holder = new ViewHolder();
holder.name = (TextView) convertView.findViewById(R.id.companyname);
holder.type = (TextView) convertView.findViewById(R.id.companytype);
holder.logo = (ImageView) convertView.findViewById(R.id.logo);
holder.category = (ImageView) convertView.findViewById(R.id.category);
holder.distance = (TextView) convertView.findViewById(R.id.distance);
holder.time = (TextView) convertView.findViewById(R.id.time);
convertView.setTag(holder);
new GetDistanceTime().execute(LocateOutlets.userLatlng, companyList.get(position).getCompanyLatLng(), holder.distance, holder.time);
holder.name.setText(companyList.get(position).getCompanyDiscout() + "% Off In Store");
holder.type.setText(companyList.get(position).getCompanyName());
imageLoader.displayImage(companyList.get(position).getCompanyLogo(), holder.logo);
imageLoader.displayImage(getCategoryImage(companyList.get(position).getCompanyType()), holder.category);
}
else
{
holder = (ViewHolder) convertView.getTag();
}
return convertView;
}
static class ViewHolder
{
TextView name;
TextView type;
ImageView logo;
ImageView category;
TextView distance;
TextView time;
}
如果我在If之外执行设置的函数,所有的图像都会继续重新加载,并且会发生奇怪的事情(例如,如果我向上滚动一页,一个已经加载的图像会重新加载一个不同的图像)。
我在这里做错了什么?
您需要移动代码中将数据链接到if语句之外的视图的部分。
ListView项已回收。这意味着当您滚动时,包含第#1行数据的列表视图项现在可能用于显示第10行。这个回收的视图被发送到getView,由于它不是null,它会跳过代码中将数据链接到视图元素的部分。除非您重写当前的内容,否则它将继续显示第1行(或之前分配给它的任何行)的数据。
因此,您希望移动代码中将数据链接到if语句之外的视图的部分。
ViewHolder holder;
if (convertView == null)
{
convertView = mInflater.inflate(R.layout.tile_company, null);
holder = new ViewHolder();
holder.name = (TextView) convertView.findViewById(R.id.companyname);
holder.type = (TextView) convertView.findViewById(R.id.companytype);
holder.logo = (ImageView) convertView.findViewById(R.id.logo);
holder.category = (ImageView) convertView.findViewById(R.id.category);
holder.distance = (TextView) convertView.findViewById(R.id.distance);
holder.time = (TextView) convertView.findViewById(R.id.time);
convertView.setTag(holder);
}
else
{
holder = (ViewHolder) convertView.getTag();
}
//I moved this block out of your if-statement
new GetDistanceTime().execute(LocateOutlets.userLatlng, companyList.get(position).getCompanyLatLng(), holder.distance, holder.time);
holder.name.setText(companyList.get(position).getCompanyDiscout() + "% Off In Store");
holder.type.setText(companyList.get(position).getCompanyName());
imageLoader.displayImage(companyList.get(position).getCompanyLogo(), holder.logo);
imageLoader.displayImage(getCategoryImage(companyList.get(position).getCompanyType()), holder.category);