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

前端 未结 3 1781
没有蜡笔的小新
没有蜡笔的小新 2020-12-02 14:05

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

3条回答
  •  轻奢々
    轻奢々 (楼主)
    2020-12-02 14:16

    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 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();
            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 adapter = new MyAZAdapter(
                    getApplicationContext(), android.R.layout.simple_list_item_1,
                    elements);
            myListView.setAdapter(adapter);
    
        }
    
        class MyAZAdapter extends ArrayAdapter implements SectionIndexer {
            ArrayList myElements;
            HashMap azIndexer;
            String[] sections;
    
            public MyAZAdapter(Context context, int textViewResourceId, List objects) {
                super(context, textViewResourceId, objects);
                myElements = (ArrayList) objects;
                azIndexer = new HashMap(); //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 keys = azIndexer.keySet(); // set of letters 
    
                Iterator it = keys.iterator();
                ArrayList keyList = new ArrayList(); 
    
                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:

    
    
    
    
    
    

    ScreenShot:

    enter image description here

提交回复
热议问题