On Nov 18, 4:15 am, Mark Murphy <mmur...@commonsware.com> wrote: > On Thu, Nov 17, 2011 at 10:01 PM, eehouse <eeeeho...@gmail.com> wrote: > > As far as I can tell, a second call tosetListAdapter( new > > MyCustomAdapter() ) has no effect: the adapter I originally installed > > in my ListActivity subclass's onCreate() method continues to get > > called. Is this a known problem/feature? > > No. > > Here is an example of an application that successfully callssetListAdapter() > multiple times, based on the user choosing a Reset > option menu choice: > > https://github.com/commonsguy/cw-android/tree/master/Menus/Inflation
Thanks Mark. I took a look at your code, then modified it to duplicate the situation I described: added a custom Adapter extending BaseAdapter and implementing SectionIndexer. As you said, when I create a new instance of the Adapter and pass it into setListAdapter() the new instance is used. So the problem I described does not exist. However, the problem that led to my mistaken assumption is duplicated in your code (as I've modified it): only the first instance of my custom Adapter ever gets its getSections() method called. So though the new Adapter has replaced the original, the Object[] of sections returned by the original continues to be used. Does anybody know if there's a way to force the framework to call getSections() when a new Adapter replaces the one that was called originally? I've worked around this problem by creating a new ListActivity instance each time my data set changes. It's a bit heavy handed but does the trick. Thanks, --Eric PS I'll append my diffs below for the sake of completeness. The "reset" menu is what triggers new data. diff --git a/Menus/Inflation/src/com/commonsware/android/inflation/ InflationDemo.java b/Menus/Inflation/src/com/commonsware/android/ inflation/InflationDemo.java index 0e182ba..b55a84f 100644 --- a/Menus/Inflation/src/com/commonsware/android/inflation/ InflationDemo.java +++ b/Menus/Inflation/src/com/commonsware/android/inflation/ InflationDemo.java @@ -1,3 +1,5 @@ +/* -*- compile-command: "cd ../../../../../; ant debug install"; -*- */ + /*** Copyright (c) 2008-2011 CommonsWare, LLC @@ -24,23 +26,73 @@ import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; +import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.EditText; +import android.widget.TextView; +import android.widget.SectionIndexer; + +import android.widget.BaseAdapter; public class InflationDemo extends ListActivity { - private static final String[] items={"lorem", "ipsum", "dolor", - "sit", "amet", "consectetuer", "adipiscing", "elit", - "morbi", "vel", "ligula", "vitae", "arcu", "aliquet", - "mollis", "etiam", "vel", "erat", "placerat", "ante", - "porttitor", "sodales", "pellentesque", "augue", "purus"}; - private ArrayList<String> words=null; + private static final int NUM_WORDS = 1000; + private static final int NUM_INDICES = 10; + private int m_counter = 1; + + private class MyListAdapter extends BaseAdapter + implements SectionIndexer { + private ArrayList<String> m_words; + + public MyListAdapter() { + super(); + } + + public int getCount() { return NUM_WORDS; } + + public Object getItem( int position ) + { + TextView text = new TextView( InflationDemo.this ); + text.setText( String.format( "%d", + position + (NUM_WORDS * m_counter) ) ); + return text; + } + + public View getView( int position, View convertView, ViewGroup parent ) { + return (View)getItem( position ); + } + + public long getItemId( int position ) { return position; } + + public int getPositionForSection( int section ) + { + return section * NUM_WORDS / NUM_INDICES; + } + + public int getSectionForPosition( int position ) + { + return position * NUM_INDICES / NUM_WORDS; + } + + public Object[] getSections() + { + String[] sections = new String[NUM_INDICES]; + for ( int ii = 0; ii < NUM_INDICES; ++ii ) { + int section = (NUM_WORDS * m_counter) + + (ii * (NUM_WORDS/NUM_INDICES)); + sections[ii] = String.format( "%d", section ); + } + return sections; + } + + } @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); initAdapter(); + getListView().setFastScrollEnabled( true ); registerForContextMenu(getListView()); } @@ -59,55 +111,22 @@ public class InflationDemo extends ListActivity { @Override public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { + switch (item.getItemId()) { case R.id.add: - add(); - return(true); + add(); + return(true); case R.id.reset: - initAdapter(); - return(true); - } + ++m_counter; + initAdapter(); + return(true); + } - return(super.onOptionsItemSelected(item)); - } - - @SuppressWarnings("unchecked") - @Override - public boolean onContextItemSelected(MenuItem item) { - AdapterView.AdapterContextMenuInfo info= - (AdapterView.AdapterContextMenuInfo)item.getMenuInfo(); - ArrayAdapter<String> adapter=(ArrayAdapter<String>)getListAdapter(); - - switch (item.getItemId()) { - case R.id.cap: - String word=words.get(info.position); - - word=word.toUpperCase(); - - adapter.remove(words.get(info.position)); - adapter.insert(word, info.position); - - return(true); - - case R.id.remove: - adapter.remove(words.get(info.position)); - - return(true); - } - - return(super.onContextItemSelected(item)); + return(super.onOptionsItemSelected(item)); } private void initAdapter() { - words=new ArrayList<String>(); - - for (String s : items) { - words.add(s); - } - - setListAdapter(new ArrayAdapter<String>(this, - android.R.layout.simple_list_item_1, words)); + setListAdapter(new MyListAdapter()); } private void add() { -- 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