我知道之前已经问过这个问题而且我已经尝试过这些解决方案,但它没有帮助。项目在第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之外执行set函数,所有图像都会继续重新加载并发生奇怪的事情(例如,如果我向上滚动页面,已经加载的图像将使用不同的图像重新加载)。
我在这里做错了什么?
答案 0 :(得分:0)
您需要移动将数据链接到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);