SectionIndexer示例

This small tutorial will show you how to create a ListView, enable fast scrolling, and create a alphabetical section list that displays the letter as you quickly scroll the list.

这个简单的教程会教你创建一个ListView,实现快速滑动,并且创建一个按字母排序的分类的列表。当你快速滑动的时候,就会显示一个字母,表示当前滚动的位置。

First lets create a layout file with a ListView in it list this

首先创建一个存在ListView的布局文件

代码如下:

 1 <?xml version="1.0" encoding="utf-8"?>
 2  
 3 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 4                 android:layout_width="fill_parent"
 5                 android:layout_height="fill_parent"
 6                 android:background="@drawable/background">
 7  
 8     <ListView
 9             android:id="@+id/thelist"
10             android:layout_width="wrap_content"
11             android:layout_height="wrap_content"
12             android:scrollbars="vertical"
13             android:fadingEdge="vertical"
14             android:cacheColorHint="#00000000"
15             android:fastScrollEnabled="true"
16             android:padding="2dp">
17     </ListView>
18 </LinearLayout>

Notice I am putting a background image on the layout and setting the ListView to be transparent with the cacheColorHint. I also set fastScrollEnabled to true. Now I have a store object to store the attributes about a store.

请注意我为整个布局设置了一个背景图片,用cacheColorHint属性吧Listview设置为透明。我也把fastScrollEnabled 属性设置为true了。 接下来我用一个store对象存储了一些关于store的属性。

public class Store {
 
    public int id;
    public String name;
    public String direction;
    public int floor;
    public String address;
    public String category;
    public String phone;
}

Finally we need to create the Activity. We will assign a custom ArrayAdapter to the list and the custom ArrayAdapter will implement SectionIndexer
最后,我们需要创建一个Activity。我们需要指派一个实现了SectionIndexer接口的自定义的ArrayAdapter给这个ListView。

/**
* The Store List Activity
*/
public class StoreListActivity extends Activity {
    private DBAdapter db;
 
    private LinkedList<Store> storeList = new LinkedList<Store>();
    private StoreListAdaptor storeListAdaptor;
 
    private ListView list;
 
    /**
     * Called when the activity is first created.
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
 
        setContentView(R.layout.storelist);
 
        list = (ListView) findViewById(R.id.thelist);
 
        // populate the store list
        storeList = db.getAllStoresOrderByName(storeList);
 
        // create an adaptor with the store list
        storeListAdaptor = new StoreListAdaptor(this,storeList);
 
        // assign the listview an adaptor
        list.setAdapter(storeListAdaptor);
 
    }
 
    /**
     * The List row creator
     */
    class StoreListAdaptor extends ArrayAdapter<Store> implements SectionIndexer{
 
        HashMap<String, Integer> alphaIndexer;
        String[] sections;
 
        public StoreListAdaptor(Context context, LinkedList<Store> items) {
            super(context, R.layout.storerow, items);
 
            alphaIndexer = new HashMap<String, Integer>();
            int size = items.size();
 
            for (int x = 0; x < size; x++) {
                Store s = items.get(x);
 
                // get the first letter of the store
                String ch =  s.name.substring(0, 1);
                // convert to uppercase otherwise lowercase a -z will be sorted after upper A-Z
                ch = ch.toUpperCase();
 
                // HashMap will prevent duplicates
                alphaIndexer.put(ch, x);
            }
 
            Set<String> sectionLetters = alphaIndexer.keySet();
 
            // create a list from the set to sort
            ArrayList<String> sectionList = new ArrayList<String>(sectionLetters); 
 
            Collections.sort(sectionList);
 
            sections = new String[sectionList.size()];
 
            sectionList.toArray(sections);
        }
 
       public View getView(int position, View convertView, ViewGroup parent) {
            // expand your row xml if you are using custom xml per row
       } 
 
       public int getPositionForSection(int section) {
           return alphaIndexer.get(sections[section]);
       }
 
       public int getSectionForPosition(int position) {
           return 1;
       }
 
       public Object[] getSections() {
            return sections;
       }
    }
}

 

posted @ 2014-05-04 17:38  sdrzlyz  阅读(443)  评论(0编辑  收藏  举报