ListView项重复

时间:2014-11-03 00:08:52

标签: android android-listview

我知道之前已经问过这个问题而且我已经尝试过这些解决方案,但它没有帮助。项目在第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函数,所有图像都会继续重新加载并发生奇怪的事情(例如,如果我向上滚动页面,已经加载的图像将使用不同的图像重新加载)。

我在这里做错了什么?

1 个答案:

答案 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);