ListView items repeating



我知道以前有人问过这个问题,我也尝试过这些解决方案,但没有帮助。项目在第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);

最新更新