android - ListView 重复显示问题
黄舟
黄舟 2017-04-17 13:43:41
[Android讨论组]

本人新手,最近在学习 ListView 的应用。我先用 ViewPager + Fragmnet + ActionBar 实现了三个滑动界面。然后在第一个 Fragment 中设置了一个 ListView 用于显示联系人数据。如图一:

接着我滑动到最后一个 Fragment 界面,然后再滑动回来,结果发现 ListView 中的数据重复显示了一遍。如图二:

之后只要滑到最后一个 Fragment 再滑回来一次,ListView 中的联系人列表就会多重复一次。这是什么问题?望高手解答。

贴上自定义 Adapter 的 getView 方法:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = LayoutInflater.from(context);
linearLayout = (LinearLayout) inflater.inflate(R.layout.list_contacts, null);
name = (TextView) linearLayout.findViewById(R.id.name_view);
number = (TextView) linearLayout.findViewById(R.id.number_view);
quickContactBadge = (QuickContactBadge) linearLayout.findViewById(R.id.quick_contact_badge);
name.setText(list.get(position).getName());
number.setText(list.get(position).getNumber());
quickContactBadge.assignContactUri(list.get(position).getDetailUri());
quickContactBadge.setImageBitmap(loadPhoto(list.get(position).getPhotoUri()));
return linearLayout;
}

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回复(5)
ringa_lee

可能是viewpager 回收了一个fragment 滑动回来就重新实例化fragment的时候你之前list还在就重复加进去了,设置 viewpager 的setOffscreenPageLimit 让他不要回收第一个或者fragment 被回收的时候清掉list

ringa_lee

自己搜索一下viewholder吧。这个是listview为了节省内存对cell进行了复用。只要用viewholder保存下就行

PHP中文网

这种实现方式不好,还是用ViewHolder做缓存处理吧,Android数据适配器(Adapter)优化:使用高效的ViewHolder

PHPz

大家都答ViewHolder,可惜不能解决问题,只是提升效率以及节省内存。
楼主还是贴数据加载的代码吧。

PHP中文网

这个情况和ViewHolder应该没有关系

  • 如楼上所说, getView() 方法最好利用上ListView的Cell重用机制
  • 重复显示数据应该是数据源内数据被重复添加了, 你打印下ListView的数据源ArrayList的内容就知道了
  • 这里面还有ViewPager的内容,建议研究完ListView, 再研究下ViewPager, 善用度娘和官方Demo,Doc

  • 最后: 贴代码要用编辑器工具栏上的 "< >", 这样更加方便别人阅读

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号