It seems that the only way to rebuild the fast scroll section data is
to toggle fast scrolling off and on again.

-- Kostya

2011/11/21 eehouse <[email protected]>:
> On Nov 18, 4:15 am, Mark Murphy <[email protected]> wrote:
>> On Thu, Nov 17, 2011 at 10:01 PM, eehouse <[email protected]> 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 [email protected]
> To unsubscribe from this group, send email to
> [email protected]
> For more options, visit this group at
> http://groups.google.com/group/android-developers?hl=en

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to