Android 自定义ListView中的重复元素甚至控制convertView==null

Android 自定义ListView中的重复元素甚至控制convertView==null,android,listview,Android,Listview,我有一个自定义的ListView,可以重复元素。我曾试图控制元素的回收,但我不确定我是否做得很好。这是我的密码: static class Holder { static TextView nombre; static TextView direccion; static RatingBar ratingBar; } @Override public View getView(int position, View convertView, ViewGroup paren

我有一个自定义的ListView,可以重复元素。我曾试图控制元素的回收,但我不确定我是否做得很好。这是我的密码:

static class Holder {
    static TextView nombre;
    static TextView direccion;
    static RatingBar ratingBar;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    Holder holder;

    if (convertView == null) {
        LayoutInflater inflater = LayoutInflater.from(context);
        convertView = inflater.inflate(R.layout.list_item_establecimientos, null);
        holder = new Holder();
    } else {
        holder = (Holder) convertView.getTag();
    }

    Holder.nombre = (TextView) convertView.findViewById(R.id.nombre_establecimiento);
    Holder.direccion = (TextView) convertView.findViewById(R.id.direccion_establecimiento);
    Holder.ratingBar = (RatingBar) convertView.findViewById(R.id.ratingBarListaEstablecimiento);

    convertView.setTag(holder);

    Holder.nombre.setText(this.establecimientos.get(position).getNombreEstablecimiento());
    Holder.direccion.setText(this.establecimientos.get(position).getNombreVia());
    Holder.ratingBar.setRating(this.establecimientos.get(position).getPuntuacionMedia());

    return convertView;
}

我的问题是,即使处理convertView==null(或convertView!=null),我也会在ListView中多次重复元素。有什么想法吗?

使用静态数据似乎是你的问题。每个类只有一个静态类成员实例。所以改变

static lass Holder { // all fields are static.  Thus only one instance exists
    static TextView nombre;
    static TextView direccion;
    static RatingBar ratingBar;
}

并更改

Holder.property.set...


像这样修改类

private static class Holder {
    private TextView nombre;
    private TextView direccion;
    private RatingBar ratingBar;
}

// And make sure that you use the holder pattern correctly. It has to be for one time binding only. You are binding the views for every getView call. So that is not proper. I think static class is not an issue, because we actually need only one instance of the class.

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view = null;

    if (convertView == null) {
        view = View.inflate(context,R.layout.list_item_establecimientos, null);
        Holder holder = new Holder();
        holder.nombre = (TextView) view.findViewById(R.id.nombre_establecimiento);
        holder.direccion = (TextView) view.findViewById(R.id.direccion_establecimiento);
        holder.ratingBar = (RatingBar) view.findViewById(R.id.ratingBarListaEstablecimiento);
        view.setTag(holder);
    } else {
        view = convertview;
    }

    Holder holder = (Holder) view.getTag();
    holder.nombre.setText(this.establecimientos.get(position).getNombreEstablecimiento());
    holder.direccion.setText(this.establecimientos.get(position).getNombreVia());
    holder.ratingBar.setRating(this.establecimientos.get(position).getPuntuacionMedia());

    return view;
}

@moictab-我看到你对这一不起作用的评论似乎已经消失了。这是否意味着这对您有效?我已经尝试了您的更改和其他一些操作,但问题仍然存在(这就是我写评论并删除它的原因),您确定您已重新安装并重新部署了应用程序吗?您是否验证了列表中每个项目的数据确实不同?是的,列表应该显示6个元素,但它显示12个(6个元素以相同的顺序重复两次)。是否有其他方法或代码需要我检查?您所描述的内容听起来与上面的代码没有问题。现在,您已经重新编写了代码,以便在Android视图重新循环中正常工作。当视图回收出现问题时,它通常不会以您描述的方式呈现。因此,我将开始查看您的数据源。也许你的数据集被复制了,但这只是一个猜测。好的,我会检查我是否正确使用了holder模式。
holder.property.set...
private static class Holder {
    private TextView nombre;
    private TextView direccion;
    private RatingBar ratingBar;
}

// And make sure that you use the holder pattern correctly. It has to be for one time binding only. You are binding the views for every getView call. So that is not proper. I think static class is not an issue, because we actually need only one instance of the class.

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View view = null;

    if (convertView == null) {
        view = View.inflate(context,R.layout.list_item_establecimientos, null);
        Holder holder = new Holder();
        holder.nombre = (TextView) view.findViewById(R.id.nombre_establecimiento);
        holder.direccion = (TextView) view.findViewById(R.id.direccion_establecimiento);
        holder.ratingBar = (RatingBar) view.findViewById(R.id.ratingBarListaEstablecimiento);
        view.setTag(holder);
    } else {
        view = convertview;
    }

    Holder holder = (Holder) view.getTag();
    holder.nombre.setText(this.establecimientos.get(position).getNombreEstablecimiento());
    holder.direccion.setText(this.establecimientos.get(position).getNombreVia());
    holder.ratingBar.setRating(this.establecimientos.get(position).getPuntuacionMedia());

    return view;
}