You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android自定义ListView重复显示及ArrayList去重解决方案咨询

解决ListView重复显示的问题

嘿,我一眼就瞅出问题出在哪儿了——你的SystemauditAdapter里的getView方法逻辑有漏洞!

当ListView滚动加载后面的条目时,会复用之前已经创建好的convertView,但你现在只在convertView == null的时候才设置文本内容,复用的时候完全没更新当前position对应的数据,这就导致第9项之后的条目都重复显示前面的内容了。

下面给你两种解决办法,推荐用第二种更规范的ViewHolder模式:

方法一:快速修正getView逻辑

不需要额外的类,直接调整逻辑,确保每次都更新数据:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if(convertView ==null){
        convertView = View.inflate(context, R.layout.list_view,null);
    }
    // 不管convertView是否被复用,都要重新获取控件并设置当前position的数据
    TextView code = convertView.findViewById(R.id.cardcode);
    TextView title = convertView.findViewById(R.id.cardTitle);
    model model = models.get(position);
    code.setText(model.getAuditcode());
    title.setText(model.getSystemAudit());
    return convertView;
}

方法二:使用ViewHolder模式(推荐)

这种方法能避免重复调用findViewById,提升ListView的性能,同时彻底解决复用导致的重复问题:

public class SystemauditAdapter extends BaseAdapter {
    private Context context;
    private ArrayList<model> models;

    public SystemauditAdapter(Context context, ArrayList<model> models) {
        this.context = context;
        this.models = models;
    }

    @Override
    public int getCount() {
        return models.size();
    }

    @Override
    public Object getItem(int position) {
        return models.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    // 定义ViewHolder类,缓存每个条目里的控件
    static class ViewHolder {
        TextView code;
        TextView title;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if(convertView ==null){
            convertView = View.inflate(context, R.layout.list_view,null);
            holder = new ViewHolder();
            // 只在第一次创建视图时执行findViewById
            holder.code = convertView.findViewById(R.id.cardcode);
            holder.title = convertView.findViewById(R.id.cardTitle);
            // 把ViewHolder绑定到convertView上
            convertView.setTag(holder);
        } else {
            // 复用视图时直接取出缓存的ViewHolder
            holder = (ViewHolder) convertView.getTag();
        }
        // 给缓存的控件设置当前position对应的数据
        model model = models.get(position);
        holder.code.setText(model.getAuditcode());
        holder.title.setText(model.getSystemAudit());
        return convertView;
    }
}

原理很直白:ViewHolder会缓存每个条目的控件,第一次创建视图时把ViewHolder和视图绑定,复用视图时直接取出ViewHolder,然后更新成当前位置的数据,这样就不会出现重复显示的情况了。

内容的提问来源于stack exchange,提问作者mezohn adhikari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:57:09