Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 索引之LinearLayout側邊欄+listview實現

索引之LinearLayout側邊欄+listview實現

編輯:關於Android編程

安卓一年新人,陸陸續續完成一些基礎控件,是進步的首要條件.今天帶來的是一個側邊欄的實現.
此方法也是從之前的一個listview的setselection方法上得到的啟發來完成的.(注意:listview定位到某一個地方就是用的setselection方法).直接上代碼!!

三個關鍵的地方:
1.右側選項欄的高度平分的item的高度對應的item的個數
2.listview的item與選項欄對應的listview的位置
3.LinearLayout的觸摸監聽的位置

基本上只要清楚這三個關鍵點,就很好理解了.用通俗的話再復述一遍:得到listview的A-Z的每一個item的位置position.觸摸LinearLayout對應的位置設在listview到某一位置.

以下是完整代碼:注釋的非常詳細,有任何疑問可以相互交流或百度.

public class MainActivity extends Activity {

    private ListView listview;//listview
    private LinearLayout linear;//linear加載右側選項欄
    private String[] indexStr = { "↑","☆","A", "B", "C", "D", "E", "F", "G", "H",  "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U",  "V", "W", "X", "Y", "Z","#" };//右側選項欄的字段

    private String[] indexStr11 = { "↑","☆","A", "B","C", "D", "E", "F", "G", "H",  "I", "J", "K", "L", "M", "N", "O", "P","Q", "R", "S", "T", "U",  "V", "W", "X", "Y", "Z","#" };///listview加載的數據標題  與之對應  的選項欄的字段

    private int height;// 字體高度  
    private boolean flag = false;//獲取高度的判斷條件
    private HashMap selector;// 存放含有索引字母的位置  
    private List>list = new ArrayList>();//list集合

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //初始化ID
        setViews();

        //設置list集合數據和listview
        setListViewlist();

        //設置右邊欄
        setHeightLinear();

    }

    //初始化ID
    private void setViews() {
        listview = (ListView) findViewById(R.id.listview);//找listview的id
        linear = (LinearLayout) findViewById(R.id.linear);//找linear的id
    }

    //設置list集合數據和listview
    private void setListViewlist() {
        list = new ArrayList>();//新建一個list集合
        for (int i = 0; i < indexStr11.length; i++) {//遍歷listview加載的數據標題  與之對應  的選項欄的字段
            Mapmap = new HashMap();//新建一個map集合
            map.put("1", indexStr11[i]);//往map集合裡面添加字段
            list.add(map);//把map集合添加到list集合裡面
            for (int k = 0; k < 3; k++) {//給對應的字段裡添加內容,如A下面有聯系人 小白 小白  小白
                Mapmap1 = new HashMap();//新建一個map集合
                map1.put("1", "小白");//往map集合裡面添加字段
                list.add(map1);//把map集合添加到list集合裡面
            }
        }

        String a[] = {"1"};//simpleadapter  加載對應的key
        int b[] = {R.id.tv};//simpleadapter  加載對應的布局id
        SimpleAdapter adapter = new SimpleAdapter(this, list, R.layout.item, a, b);//simpleadapter
        listview.setAdapter(adapter);//listview加載adapter
        listview.setOnItemClickListener(new OnItemClickListener() {//listview的點擊方法
            @Override
            public void onItemClick(AdapterView arg0, View arg1, int arg2,
                    long arg3) {
                Toast.makeText(MainActivity.this, list.get(arg2).get("1"),0).show();//對應item上面的值得Toast
            }
        });
    }


    //此方法被執行起,用戶可以與應用進行交互了
    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        // 在oncreate裡面執行下面的代碼沒反應,因為oncreate裡面得到的getHeight=0  
        if (!flag) {// 這裡為什麼要設置個flag進行標記,我這裡不先告訴你們,請讀者研究,因為這對你們以後的開發有好處   //不判斷  會重復獲取,用戶體驗不好
            height = linear.getMeasuredHeight() / indexStr.length;  
            setHeightLinear(); 
            flag = true;  
        } 
    }

    //設置右邊欄
    private void setHeightLinear() {

        selector = new HashMap(); //初始化map集合 
        for (int j = 0; j < indexStr.length; j++) {// 循環字母表,找出newPersons中對應字母的位置  
            for (int i = 0; i < list.size(); i++) { //循環list集合,找到與indexStr數據相對應的集合位置 
                if (list.get(i).get("1").equals(indexStr[j])) {  
                    selector.put(indexStr[j], i);  //將對應的key  和  list集合對應的數據  添加到select集合裡
                }  
            }  
        }

        LinearLayout.LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, height);//獲取layout  params
        for (int i = 0; i < indexStr.length; i++) {//遍歷indexStr數據
            final TextView tv = new TextView(this);  //new一個textView
            tv.setLayoutParams(params);  //設置布局
            tv.setText(indexStr[i]);  //設置文本
            tv.setPadding(10, 0, 10, 0);  //設置外邊距
            linear.addView(tv); //添加到linearlayout布局裡
            linear.setOnTouchListener(new OnTouchListener() {  //linearlayout的觸摸手勢

                @Override  
                public boolean onTouch(View v, MotionEvent event)  

                {  
                    float y = event.getY();//得到linearlayout的高度
                    int index = (int) (y / height);  //根據高度除以item的高度  獲得個數
                    if (index > -1 && index < indexStr.length) {// 防止越界  
                        String key = indexStr[index];  //獲得對應的數組的key值
                        if (selector.containsKey(key)) {  //集合判斷是否有此key
                            int pos = selector.get(key);  //有則取到key--value
                            if (listview.getHeaderViewsCount() > 0) {// 防止ListView有標題欄.
                                listview.setSelectionFromTop(  
                                        pos + listview.getHeaderViewsCount(), 0);  //定位到listview的響應位置
                            } else {  
                                listview.setSelectionFromTop(pos, 0);// 滑動到第一項  
                            }  
                        }  
                    }  
                    return true;  
                }  
            });
        }  


    }

}

兩個xml的文件我也直接粘貼出來了.



    

    




    

        

        

    

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved