2012-08-28 47 views
0

我有一个ListView,我通过一个复杂的编码位。该列表通常会随着需要不同视图的不同类型的数据而变化。在罕见的情况下,我最终会看到1个视图被Android重复使用,应该看起来不同。它似乎只发生在从根本上显示的数据发生变化时。我希望有一种方法来编程清理ListView的内存。这可能吗?清除ListView的查看缓存

这里是我getView的开头:

@Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      SearchHolder holder = null; 
      int type = getItemViewType(position); 

      if (null == convertView) { 
       holder = new SearchHolder(); 
       if (type == SEARCH_TYPE_FREETEXT) { 
        convertView = mInflater.inflate(R.layout.layout_search_item_freetext, null); 
        holder.txtText = (TextView) convertView.findViewById(R.id.search_itemname); 
        holder.vHeaderWrapper = (LinearLayout) convertView.findViewById(R.id.search_headerwrapper); 
        holder.txtHeader = (TextView) convertView.findViewById(R.id.search_header); 
       } 
       else { 
        if (items.get(position).mData == null) { 
         convertView = mInflater.inflate(R.layout.layout_loadmoreresults_white, null); 
        } 
        else { 
         convertView = mInflater.inflate(R.layout.layout_search_item, null); 
         holder.txtText = (TextView) convertView.findViewById(R.id.search_itemname); 
         holder.vHeaderWrapper = (LinearLayout) convertView.findViewById(R.id.search_headerwrapper); 
         holder.txtHeader = (TextView) convertView.findViewById(R.id.search_header); 
        } 
       } 
       convertView.setTag(holder); 
      } 
      else { 
       holder = (SearchHolder)convertView.getTag(); 
      } 
... 
+0

我已经回答了这个问题http://stackoverflow.com/questions/12049198/how-to-clear-the-views-which-are-held-in-the-listviews-recyclebin这似乎是你想。 – Luksprog

+0

我用'invalidate()',但我的问题仍然存在。我将新数据放入我的ArrayAdapter中,并调用notify'notifyDataSetChanged()',它仍在重用需要切换到另一个布局的布局。 – Andrew

+0

如果你正确地实现了'getViewTypeCount'和'getItemViewType'方法,那么所有应该都可以(从你的代码看来,你只有两种类型的行,所以复杂性不应该那么大)。我认为在更新适配器的数据时,您没有更新正确的getItemViewType方法以返回正确的结果。 – Luksprog

回答

0

的ListView做一些所谓的“循环”,当您通过滚动列表,以及你需要做的是重写getView()方法来更新个人的ListView正在回收的物品。默认情况下,android不会清除这些视图。请查看以下链接的ListView回收:

http://mobile.cs.fsu.edu/the-nuance-of-android-listview-recycling-for-n00bs/

没有代码是很难说,如果你已经知道这与否,但是这是我的经验,这种问题的原因。

+0

这正是我正在做的。我已经更新了OP来展示这一点。 – Andrew

0

如果您为列表项目使用多个布局,那么我建议每次在getView()方法中从xml中充填合适的布局。