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
相关产品推荐
相关产品推荐

