I have already tried making the ListAdapter a completely separate public class, and it does not seem to help. I can post that code, if it would be helpful (perhaps I have something wrong with it).
Thanks. On Oct 21, 5:33 pm, Mark Murphy <mmur...@commonsware.com> wrote: > Move your ListAdapter to a public class or a static inner class of > your Activity, and see if that helps. A ListView being its own adapter > is not a well-trod path. > > > > On Thu, Oct 21, 2010 at 8:04 PM, John Gaby <jg...@gabysoft.com> wrote: > > I am still struggling with a memory leak associated with a ListView. > > I have created the following small program which exhibits this > > behavior. > > > What I do is create 2 LinearLayouts. The first has a Button and a > > GListView control. The code for GListView is below, but it just sub- > > classes ListView, and implements the ListAdapter interface. When the > > GListView is created, it sets it's adapter to itself. > > > Now when you press the button I switch to the second LinearLayout. > > This layout has only a single button. When you press this button, I > > create a new 1st layout with a new GListView and set it as the active > > view. > > > Run the program, and switch between the two views 20 times. Then > > bring up the DDMS and force a garbage collection. Then Dump the heap, > > and use the Memory Analyzer and you will find 21 GListView objects > > remaining. That is, the 20 GListViews that are not longer connected > > to anything have NOT been freed. > > > Now if I comment out the 'setAdapter(this)' function in the GListView > > constructor and repeat the above, I find that there is only 1 > > GListView that remains. That is, in this case, all of the unused > > GListViews have been properly recycled. > > > Someone suggested that I create a private class within my GListView to > > handle the ListAdapter interface, and I tried that, but it did not > > help. > > > Surely there is some way to make these objects go away when they are > > no longer used anywhere. (Isn't that what garbage collection is all > > about?) > > > Any help would be appreciated. I am really pulling my hair out on > > this one. > > > Thanks. > > > /* > > * Activity > > */ > > > package com.gabysoft.memoryleak; > > > import android.app.Activity; > > import android.os.Bundle; > > import android.view.View; > > import android.widget.Button; > > import android.widget.LinearLayout; > > import android.widget.ListView; > > > public class MemoryLeak extends Activity implements > > android.view.View.OnClickListener > > { > > LinearLayout ll2; > > boolean page2 = false; > > > private LinearLayout CreateLayout() > > { > > LinearLayout ll = new LinearLayout(this); > > > Button btn1 = new Button(this); > > ListView lv = new GListView(this); > > > btn1.setText("Press"); > > btn1.setLayoutParams(new LinearLayout.LayoutParams(100, 40)); > > btn1.setOnClickListener(this); > > > ll.addView(btn1); > > ll.addView(lv); > > > return(ll); > > } > > > /** Called when the activity is first created. */ > > �...@override > > public void onCreate(Bundle savedInstanceState) > > { > > super.onCreate(savedInstanceState); > > > CreateLayout(); > > > LinearLayout ll = CreateLayout(); > > ll2 = new LinearLayout(this); > > > Button btn2 = new Button(this); > > > btn2.setText("Back"); > > btn2.setLayoutParams(new LinearLayout.LayoutParams(100, 40)); > > btn2.setOnClickListener(this); > > > ll2.addView(btn2); > > > setContentView(ll); > > } > > > �...@override > > public void onClick(View v) > > { > > if (page2) > > { > > LinearLayout ll = CreateLayout(); > > > setContentView(ll); > > > page2 = false; > > } > > else > > { > > setContentView(ll2); > > page2 = true; > > } > > } > > > } > > > /* > > * GListView > > */ > > package com.gabysoft.memoryleak; > > > import android.content.Context; > > import android.database.DataSetObserver; > > import android.view.View; > > import android.view.ViewGroup; > > import android.widget.AdapterView; > > import android.widget.ListAdapter; > > import android.widget.ListView; > > import android.widget.TextView; > > > public class GListView extends ListView implements ListAdapter > > { > > Context m_context; > > DataSetObserver m_observer = null; > > > public GListView(Context context) > > { > > super(context); > > > m_context = context; > > > setAdapter(this); > > > setChoiceMode(CHOICE_MODE_SINGLE); > > } > > > /* > > * ListAdapter > > */ > > > �...@override > > public boolean areAllItemsEnabled() > > { > > return true; > > } > > > �...@override > > public boolean isEnabled(int position) > > { > > return true; > > } > > > �...@override > > public int getCount() > > { > > return(0); > > } > > > �...@override > > public Object getItem(int position) > > { > > return null; > > } > > > �...@override > > public long getItemId(int position) > > { > > return(position); > > } > > > �...@override > > public int getItemViewType(int position) > > { > > return 0; > > } > > > �...@override > > public View getView(int position, View convertView, ViewGroup > > parent) > > { > > TextView tv = new TextView(m_context); > > > tv.setText("Item"); > > > return(tv); > > } > > > �...@override > > public int getViewTypeCount() > > { > > return 1; > > } > > > �...@override > > public boolean hasStableIds() > > { > > return false; > > } > > > �...@override > > public boolean isEmpty() > > { > > return false; > > } > > > �...@override > > public void registerDataSetObserver(DataSetObserver observer) > > { > > m_observer = observer; > > } > > > �...@override > > public void unregisterDataSetObserver(DataSetObserver observer) > > { > > m_observer = null; > > } > > } > > > -- > > You received this message because you are subscribed to the Google > > Groups "Android Developers" group. > > To post to this group, send email to android-developers@googlegroups.com > > To unsubscribe from this group, send email to > > android-developers+unsubscr...@googlegroups.com > > For more options, visit this group at > >http://groups.google.com/group/android-developers?hl=en > > -- > Mark Murphy (a Commons > Guy)http://commonsware.com|http://github.com/commonsguyhttp://commonsware.com/blog|http://twitter.com/commonsguy > > Android App Developer Books:http://commonsware.com/books -- You received this message because you are subscribed to the Google Groups "Android Developers" group. To post to this group, send email to android-developers@googlegroups.com To unsubscribe from this group, send email to android-developers+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/android-developers?hl=en