1. 程式人生 > >【Android】ListView的基礎學習

【Android】ListView的基礎學習

 class MyAdapter extends BaseAdapter {

        @Override //有多少資料數目就返回多少數目,如果返回1就只顯示一條數目的view
        public int getCount() {
            return datas.size();
        }

        @Override //響應position對應的item
        public Object getItem(int position) {
            return datas.get(position);//return null;
        }

        @Override  //返回position位置對應的id
        public long getItemId(int position) {
            return position; //return 0;
        }

        @Override //用來顯示資料的view
        public View getView(final int position, View convertView, ViewGroup parent) {
           TextView tv=new TextView(MainActivity.this);//不能this,這是java基礎,this在這裡指的是介面卡
           tv.setText(position);      
   SYSO; //   誤區:不是介面卡中有多少數目(getcount())就列印多少次,是滑動到哪裡才getview到哪裡,列印到哪裡,。
         //所以如果“快速”滑動count為超級多的listview,就很可能記憶體溢位,就算是java中的垃圾回收機制也架不住申請記憶體>>釋放的東西啊...解決方法與convertView有關
            return tv;
               }

    }
看文件的技巧:listview需要adapter(然而這是有好多方法的介面!),所以我們可以找一下這個介面的子類。不用implements 介面,直接extends 介面的子“類”(不是子介面)
param:
convertView:old view to reuse。當拉動listview的時候,上面的已經看不到的view其實是進入了“緩衝區”,這個相當於歷史快取物件。 
            注意:應該檢查它是否為空。
假如一個Listview在一個螢幕下有20個item能顯示,那麼當convertView是空的時候,那麼它就會建立20個item,然後到21的時候,就不會建立了,就會reuse複用了剛開始建立的20個item中的第一個item的位置。其實就是“迴圈”利用。
xml小積累:
fastScollorEnable=“true” 可以快速滑動不報錯(溢位),和上面那個有關。而且旁邊有個條,滑動很快。
layout_ToRightOf="@id/"兩個控制元件之間的關係。
singleLine="true" 設定textview為單行
ellipsize="end"() 設定tv多餘的文字為...,且在後面加上...也能設定前面
listView中的奇怪現象:如果一個item為4的listview(在getview()中設定列印動作)的height是match,那麼它在列印臺列印四次,如果是wrap就列印十六次(不一定,但是肯定多)。
原因:match的話知道螢幕高和一個item的高,它可以計算一個螢幕能顯示多少item,但是wrap就不能,於是系統就會反覆校驗。
普通的listview設定:在main佈局中直接加上listview
高階的Listview設定:建立一個佈局(一行的item),用inflater打氣筒(可以通過打氣筒把xml換成view)
   @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            View view;
            if(convertView == null){
                view = View.inflate(parent.getContext(), R.layout.item_number, null); //viewgroup:可設定為null
            }else {
                view = convertView;
            }

            TextView tv_number = (TextView) view.findViewById(R.id.tv_number);
            tv_number.setText(datas.get(position));


            return view;
        }
viewgroup:就像linearlayout佈局啥的,能有自己的孩子。
ArrayAdapter:很適合很簡單的Listview
直接 ArrayAdapter<String> arr=new ArrayAdapter<String>(this,xml佈局(這隻有一個textview都行了,連父佈局都不需要),String[])
SimpleAdapter: