Android Studio:Fragment中for循环致列表项重复,如何终止循环?
解决TabLayout+ListFragment数据重复与循环异常问题
我来帮你分析下你遇到的两个问题:
问题根源
- 列表项重复显示:你把
lst这个ArrayList设成了类的成员变量,每次切换Tab回到这个Fragment时,系统会重新调用onCreateView方法,而你每次都会往同一个lst里添加新的HashMap数据,导致列表里的内容不断累积,切换次数越多重复项就越多。 - 循环无法终止的误解:看你的代码,循环条件是
i < imag.length,而imag的长度是5,理论上这个循环只会执行5次就结束。你觉得循环没终止,大概率是因为每次重建Fragment都重复添加数据,让你误以为循环一直在跑。
具体解决方案
这里给你几个可行的解决办法,按推荐程度排序:
方案1:将列表和适配器改为局部变量(最推荐)
没必要把lst和adapter作为类的成员变量,直接放到onCreateView方法里作为局部变量,每次重建View时都会重新创建全新的列表,从根源避免数据累积:
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // 把列表移到方法内部,每次创建View时都重新初始化 ArrayList<HashMap<String, String>> lst = new ArrayList<HashMap<String, String>>(); for (int i=0; i<imag.length; i++){ HashMap<String, String> hmap = new HashMap<String, String>(); hmap.put("storynum", storynum[i]); hmap.put("imag",Integer.toString(imag[i])); lst.add(hmap); } String[] in = {"storynum","imag"}; int[] out = {R.id.txtloc, R.id.imgvi}; SimpleAdapter adapter = new SimpleAdapter(getActivity(), lst,R.layout.listview_layout, in, out); setListAdapter(adapter); return super.onCreateView(inflater, container, savedInstanceState); }
方案2:填充数据前清空列表
如果非要保留成员变量,就在每次循环添加数据前,先清空lst里的旧数据:
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { HashMap<String, String> hmap = new HashMap<String, String>(); // 循环前先清空列表,避免旧数据残留 lst.clear(); for (int i=0; i<imag.length; i++){ hmap = new HashMap<String, String>(); hmap.put("storynum", storynum[i]); hmap.put("imag",Integer.toString(imag[i])); lst.add(hmap); } String[] in = {"storynum","imag"}; int[] out = {R.id.txtloc, R.id.imgvi}; adapter = new SimpleAdapter(getActivity(), lst,R.layout.listview_layout, in, out); setListAdapter(adapter); return super.onCreateView(inflater, container, savedInstanceState); }
方案3:在View销毁时清理数据
还可以在Fragment的onDestroyView方法里清空列表并释放适配器,确保下次重建时没有旧数据:
@Override public void onDestroyView() { super.onDestroyView(); if (lst != null) { lst.clear(); } setListAdapter(null); // 释放适配器对列表和View的引用 }
这些方法都能解决你遇到的重复显示问题,同时也能消除你对“循环无法终止”的误解~
内容的提问来源于stack exchange,提问作者user10990943
相关产品推荐
相关产品推荐

