ListView右侧有字母,就像iPhone一样。可能吗?

时间:2011-06-25 02:27:37

标签: android android-listview

我想知道Android中的ListView是否可以选择将字母放在右侧,就像iPhone ListView的范例一样,如下所示

enter image description here

如果是,有人可以向我提供示例代码。

我不是在寻找ApisDemo中带有Alphabet叠加的那个,而是像iPhone范例那样的精确叠加。有可能吗?

3 个答案:

答案 0 :(得分:22)

您可以查看此项目https://github.com/woozzu/IndexableListView。 这是屏幕截图enter image description here

答案 1 :(得分:20)

我实施了类似的东西,所以我修改了我的活动,你可以看看下面,对不起它评论不太好 - 希望它有所帮助!

  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
        }
    }
}

使用xml:

<?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>

截图:

enter image description here

答案 2 :(得分:0)

如果您愿意编写代码,则可能是这样,但AOSP联系人应用程序中显示的快速滚动条是平台提供的方式,可以显示部分索引列表。