1

我已经实现了一个分区列表视图,以便每个部分都有一个使用this guide的适配器,并且可能会导致滚动时不断重复分配视图,并且由于存在不同的适配器而无法重用(但是当向后滚动时,它重用但对于相同的适配器)和它的getView方法就是这样(简化):Android ListView内存泄漏?

 Map< String, ? > object = null; 
     String id = null, title = null, rating = null, pic_url = null; 
     object = sectionContent.get(position).getMap(); 
     id = (String) object.get(EventRowValues.ROW_ID); 
     title = (String) object.get(EventRowValues.ROW_TITLE); 
     pic_url = (String) object.get(EventRowValues.ROW_PIC_URL); 

     View hView = convertView; 
     if (hView == null) { 
      hView = mInflater.inflate(R.layout.popularity_row, null); 
      ViewHolder holder = new ViewHolder(); 
      holder.pic = (ImageView) hView.findViewById(R.id.icon); 
      holder.title = (TextView) hView.findViewById(R.id.label); 
      hView.setTag(holder); 
     } 

     final ViewHolder holder = (ViewHolder) hView.getTag(); 

     holder.id = id; 

     mImageWorker.loadImage(pic_url, holder.pic); 

     holder.title.setText(title); 

     return hView; 

的方法的LoadImage是从this google example

问题是,当我滚动它需要更多的内存,例如2到5行的5 MB。当我回滚时,它不会占用更多的内存,但据我所知,它不应该分配这么多的内存,因为它重用了视图,因为我期望它在内存加载时以及当我滚动时使用内存来自缓存的相同视图和位图(因为大部分可绘制对象都是从缓存中返回的相同对象)。

可能是什么问题? 任何其他选项更聪明的可重用的分段列表视图?

非常感谢。

+0

那么你的问题是通过我的解决方案解决的吗? – Shrikant

回答

2

想通了, 我使用了前面提到过的指南中的剖视图视图,它不会正确地重用这些单元格。我已经使用一些补丁实现了ExpandableListView,以使其工作,现在它很棒。

谢谢。

1

注释掉mImageWorker.loadImage(pic_url,holder.pic);而在内存消耗

+0

这是相同的消费。滚动列表(30项)为7MB。可能是分配视图本身,它的imageViews负责这种消费,也许细胞单元正在分配,而不是重用(但是当我回滚它仍然是7MB)。 –

+0

我已经从xml和与此视图相对应的代码中删除了imageViews,现在这个列表需要3MB ...仍然太多... –

+0

并且它对于每个新的10行还是会加载高达2 MB ? – logcat

2

显示差异试试这个:UPDATE:

 ViewHolder holder = new ViewHolder(); 

     if (convertView == null) { 
      holder = new ViewHolder(); 
      hView = mInflater.inflate(R.layout.popularity_row, null); 
      holder.pic = (ImageView) hView.findViewById(R.id.icon); 
      holder.title = (TextView) hView.findViewById(R.id.label); 
      hView.setTag(holder); 
     } else { 
      holder = (ViewHolder) view.getTag(); 
     } 

PS:您已经创建持有者对象两次。它真的需要吗?

的Android您使用的,怎么我也有同样的问题,我使用,并在更高版本的版本11,如果你希望能够快速地滚动列表版本,你需要给在activity tagandroid:hardwareAccelerated="true"属性,清单文件。

+0

谢谢,但这段代码和我的区别是什么?即使在不需要的情况下,您也可以分配持有人。你的意思是API级别?那么android:hardwareAccelerated会做什么?谢谢 –

+0

请看我更新的代码。在这里,我只创建了一个持有者对象,并在随后的调用中使用它。创建一个对象并赋值给它是有区别的。在这里,我只是第一次创建了对象,并为后续调用分配了值。对于HardwareAcceleration请阅读:http://developer.android.com/guide/topics/graphics/hardware-accel.html – Shrikant

+0

谢谢,我发现有趣的见解后更新了问题。 –