[Tut]Alphabetic FastScroll ListView - similar to Contacts

Tutorials with advanced 'difficulty' and more Lines of Code.

Re: [Tut]Alphabetic FastScroll ListView - similar to Contact

Postby b4rd » Sun Dec 19, 2010 1:03 am

Is there a way to customize that fastscroller image?
b4rd
Once Poster
Once Poster
 
Posts: 1
Joined: Sun Dec 19, 2010 1:01 am

Top

Re: [Tut]Alphabetic FastScroll ListView - similar to Contact

Postby win_wizardy » Sat Apr 16, 2011 10:46 am

hi qlimax, thank you so much for the tutorial its help me a lot!.
may i ask please...
how if i want to use my own arraylist instead of that random element?
please show me..
[size=50]thank you for teaching me[/size]
win_wizardy
Freshman
Freshman
 
Posts: 2
Joined: Wed Feb 16, 2011 6:53 pm

Re: [Tut]Alphabetic FastScroll ListView - similar to Contact

Postby tomhammond » Mon Jan 30, 2012 10:34 pm

Thanks for the code on using Alphabetic FastScroll! It's a clever piece of programming.

Is it possible to re-use a listview with the Alpha Indexer? For instance, I first display a listView with 1,000 items that are unsorted and set setFastScrollEnabled to true to allow it to be searched quickly, like this:

Code: Select all
myListView = (ListView) findViewById(R.id.myListView);
myListView.setFastScrollEnabled(true);
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1,PLAYLIST);
myListView.setAdapter(arrayAdapter);


While looking at this list, if the user chooses to sort the list, the listView is "recycled" to a sorted list that uses setFastScroll in addition to the Alpha Indexer to show the letters of the alphabet when scrolling, like this:

Code: Select all
myListView = (ListView) findViewById(R.id.myListView);
myListView.setFastScrollEnabled(true);
MyIndexerAdapter<String> adapter = new MyIndexerAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1,PLAYLIST_SORTED);
myListView.setAdapter(adapter);


Note that the MyIndexerAdapter calls the Alpha Indexer routines for this second use of listView.

When the program runs, the unsorted list is displayed first. If the user does NOT use the fast scroll on this list, but chooses to display the sorted list, the Alpha Indexer fast scroll on the second (sorted) list works.

However, if the first unsorted list is shown and the user uses the fast scroll on the unsorted list (without selecting anything), then the users chooses to display the sorted list, the sorted fast scroll does NOT show the Alpha Indexer!

In other words, manipulating the fast scroller on the unsorted list causes the fast scroller on the second list not to show the Alpha Indexer letter while scrolling the second list. Does anyone know why?

Here is the full activity in case you want to understand what I am trying to do:

Code: Select all
package tom.mcas;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SectionIndexer;
import android.widget.Toast;

public class playlist extends Activity
  {
  public String playlistCollection;
  public String playMode;
  public String sortPlaylist;
  //public String[] PLAYLIST;
 
  private dataHelper dh;
  ListView myListView;
  ArrayList<String> PLAYLIST;
  ArrayList<String> PLAYLIST_SORTED;

  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState)
    {
    super.onCreate(savedInstanceState);

    //The next two lines removes the application titlebars (must go before setContentView)
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
   
    setContentView(R.layout.lists);
   
    this.dh = new dataHelper(this);

      SharedPreferences settings = getSharedPreferences("MCAS",0);
      playlistCollection = settings.getString("collection","");
    sortPlaylist=getResources().getString(R.string.sortPlaylistString);
      playMode=settings.getString("playMode","NONE");

    PLAYLIST = new ArrayList<String>(this.dh.selectPlaylist(playlistCollection,sortPlaylist,playMode));

    if (PLAYLIST.size()==1)
      {
      //No songs found (because there are no favorites), so abort.
     Toast.makeText(this, getResources().getString(R.string.errorFavNoPlaylist), Toast.LENGTH_LONG).show();
      finish();
      }   
    else
      {   
      if (PLAYLIST.size()==2)
        {
        //Only one song in the list, so auto-select it and save to preferences
       Toast.makeText(this, PLAYLIST.get(1) + " " + getResources().getString(R.string.autoSelectedString), Toast.LENGTH_LONG).show();
        SharedPreferences.Editor editor = settings.edit();
        editor.putString("playModePosition", "1");
        editor.commit();
 
        Intent mainIntent = new Intent(this, play.class);
        mainIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP );
        startActivity(mainIntent);
        finish();
        }
   
      myListView = (ListView) findViewById(R.id.myListView);
      myListView.setFastScrollEnabled(true);
      ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1,PLAYLIST);
      myListView.setAdapter(arrayAdapter);   
     
      myListView.setOnItemClickListener(new OnItemClickListener()
        {
        public void onItemClick(AdapterView<?> arg0, View view, int arg2,long itemID)
          {
          String chosenSong="";
          if (sortPlaylist.length()>0)
            chosenSong = PLAYLIST.get(arg2);
          else
            chosenSong = PLAYLIST_SORTED.get(arg2);

          if (chosenSong.equals(sortPlaylist))
            {
            sortPlaylist="";   

            PLAYLIST_SORTED = new ArrayList<String>(dh.selectPlaylist(playlistCollection,sortPlaylist,playMode));

            myListView = (ListView) findViewById(R.id.myListView);
            myListView.setFastScrollEnabled(true);
            MyIndexerAdapter<String> adapter = new MyIndexerAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1,PLAYLIST_SORTED);
            myListView.setAdapter(adapter);
            }
          else
            {
            //Save chosen song position in preferences
            SharedPreferences settings = getSharedPreferences("MCAS",0);
            SharedPreferences.Editor editor = settings.edit();

            //If song was chosen from sorted playlist, get song position from original unsorted list
            if (sortPlaylist.equals(""))
              {
               for (int i=0; i < PLAYLIST.size()-1; i=i+1)
                 {
                 if (PLAYLIST.get(i).equals(chosenSong))
                   {
                  arg2=i;
                  break;
                  }
                 }
              }

            editor.putString("playModePosition", Integer.toString(arg2));
            editor.commit();
       
            Intent mainIntent = new Intent(playlist.this, play.class);
            mainIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP );
            startActivity(mainIntent);
            finish();
            }
          }
        });
      }
    }
 
  class MyIndexerAdapter<T> extends ArrayAdapter<T> implements SectionIndexer
    {
    ArrayList<String> myElements;
    HashMap<String, Integer> alphaIndexer;

    String[] sections;

    public MyIndexerAdapter(Context context, int textViewResourceId,List<T> objects)
      {
      super(context, textViewResourceId, objects);
      myElements = (ArrayList<String>) objects;
      //here is the tricky stuff
      alphaIndexer = new HashMap<String, Integer>();
      // in this hashmap we will store here the positions for
      // the sections

      int size = PLAYLIST_SORTED.size();
      for (int i = size - 1; i >= 0; i--)
        {
        String element = PLAYLIST_SORTED.get(i);
        alphaIndexer.put(element.substring(0, 1), i);
        //We store the first letter of the word, and its index.
        //The Hashmap will replace the value for identical keys are putted in
        }

      // now we have an hashmap containing for each first-letter
      // sections(key), the index(value) in where this sections begins

      // we have now to build the sections(letters to be displayed)
      // array .it must contains the keys, and must (I do so...) be
      // ordered alphabetically

      Set<String> keys = alphaIndexer.keySet(); // set of letters ...sets
      // cannot be sorted...

      Iterator<String> it = keys.iterator();
      ArrayList<String> keyList = new ArrayList<String>(); // list can be
      // sorted

      while (it.hasNext())
        {
        String key = it.next();
        keyList.add(key);
        }

      Collections.sort(keyList);

      sections = new String[keyList.size()]; // simple conversion to an
      // array of object
      keyList.toArray(sections);

      // ooOO00K !
      }

    //@Override
    public int getPositionForSection(int section)
      {
      // Log.v("getPositionForSection", ""+section);
      String letter = sections[section];

      return alphaIndexer.get(letter);
      }

    //@Override
    public int getSectionForPosition(int position)
      {
      // you will notice it will be never called (right?)
      // Log.v("getSectionForPosition", "called");
      return 0;
      }

    //@Override
    public Object[] getSections()
      {
      return sections; // to string will be called each object, to display
      // the letter
      }
    }
  }
tomhammond
Once Poster
Once Poster
 
Posts: 1
Joined: Mon Jan 30, 2012 10:29 pm

Top
Previous

Return to Advanced Tutorials

Who is online

Users browsing this forum: No registered users and 8 guests