Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ListView with alphabets on the right, like the iPhone. Is it possible?

I would like to know if a ListView in Android has an option to place alphabets on the right like the paradigm of iPhone ListView, like below

enter image description here

If yes, can someone provide me with sample codes.

I am not looking for the one with an Alphabet overlay from ApisDemo but an exact one like the iPhone paradigm. Is it possible?

like image 513
Sana Avatar asked Jun 25 '11 02:06

Sana


2 Answers

You can check this project https://github.com/woozzu/IndexableListView. Here is the screenshotenter image description here

like image 72
Trung Nguyen Avatar answered Oct 26 '22 18:10

Trung Nguyen


I implemented somthing similar a while back so i've modified my activity and you can take a look below, sorry its not very well commented - hope it helps!

  public class AZIndexer extends Activity {
    ListView myListView;
    ArrayList<String> elements;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // elements
        String s = "MNBVCXZLKJHGFDSAQWERTYUIOP";
        Random r = new Random();
        elements = new ArrayList<String>();
        for (int i = 0; i < 300; i++) {
            elements.add(s.substring(r.nextInt(s.length())));
        }
        Collections.sort(elements); // Must be sorted!

        // listview
        myListView = (ListView) findViewById(R.id.myListView);
        myListView.setFastScrollEnabled(true);
        MyAZAdapter<String> adapter = new MyAZAdapter<String>(
                getApplicationContext(), android.R.layout.simple_list_item_1,
                elements);
        myListView.setAdapter(adapter);

    }

    class MyAZAdapter<T> extends ArrayAdapter<T> implements SectionIndexer {
        ArrayList<String> myElements;
        HashMap<String, Integer> azIndexer;
        String[] sections;

        public MyAZAdapter(Context context, int textViewResourceId, List<T> objects) {
            super(context, textViewResourceId, objects);
            myElements = (ArrayList<String>) objects;
            azIndexer = new HashMap<String, Integer>(); //stores the positions for the start of each letter

            int size = elements.size();
            for (int i = size - 1; i >= 0; i--) {
                String element = elements.get(i);
                //We store the first letter of the word, and its index.
                azIndexer.put(element.substring(0, 1), i); 
            } 

            Set<String> keys = azIndexer.keySet(); // set of letters 

            Iterator<String> it = keys.iterator();
            ArrayList<String> keyList = new ArrayList<String>(); 

            while (it.hasNext()) {
                String key = it.next();
                keyList.add(key);
            }
            Collections.sort(keyList);//sort the keylist
            sections = new String[keyList.size()]; // simple conversion to array            
            keyList.toArray(sections);
        }

        public int getPositionForSection(int section) {
            String letter = sections[section];
            return azIndexer.get(letter);
        }

        public int getSectionForPosition(int position) {
            Log.v("getSectionForPosition", "called");
            return 0;
        }

        public Object[] getSections() {
            return sections; // to string will be called to display the letter
        }
    }
}

With xml as:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
<ListView 
    android:id="@+id/myListView" 
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
</ListView>
</LinearLayout>

ScreenShot:

enter image description here

like image 40
Kenny Avatar answered Oct 26 '22 19:10

Kenny