1. 程式人生 > >安卓入門之ListView控制元件實現

安卓入門之ListView控制元件實現

ListView介紹

安卓中ListView是一種自定義清單表,我們經常在淘寶上搜索寶貝後所出現的上下可滑動的商品列表、QQ/微信訊息列表等都是ListView控制元件來做的,下面紅框框中就是ListView。

有沒有一種豁然開朗的感覺(瘋狂暗示)。。。所以掌握ListView這種控制元件的使用方法對Android開發是非常有用的。從QQ訊息清單中,每一個QQ好友列表就是ListView中的一個元素,每一行中我們發現有影象、Id、訊息、時間,這些就是ListView的每一個元素的組成部分,所以ListView還是比較強大的 ,它可以自定義各種風格,只有你想不到,沒有它做不到。


ListView使用原理

1.  建立自定義ListView顯示樣式layout_xml

2.  在Activity對應的XML中,拖入ListView,並設定ID

3.  在Activity中利用Java程式碼操作實現,介面卡原理

An Adapter object acts as a bridge between an AdapterView and the underlying data for that view. The Adapter provides access to the data items. The Adapter is also responsible for making a 

View for each item in the data set.(摘自Android官網)

                   什麼是資料介面卡?

下圖展示了資料來源、介面卡、ListView等資料展示控制元件之間的關係。我們知道,資料來源是各種各樣的,而ListView所展示資料的格式則是有一定的要求的。資料介面卡正是建立了資料來源與ListView之間的適配關係,將資料來源轉換為ListView能夠顯示的資料格式,從而將資料的來源與資料的顯示進行解耦,降低程式的耦合性。這也體現了Android的介面卡模式的使用。對於ListView、GridView等資料展示控制元件有多種資料介面卡,本文講解最通用的資料介面卡——BaseAdapter。

.                 ListView的顯示與快取機制

我們知道,ListView、GridView等控制元件可以展示大量的資料資訊。假如下圖中的ListView可以展示100條資訊,但是螢幕的尺寸是有限的,一螢幕只能顯示下圖中的7條。當向上滑動ListView的時候,item1被滑出了螢幕區域,那麼系統就會將item1回收到Recycler中,即View緩衝池中,而將要顯示的item8則會從快取池中取出佈局檔案,並重新設定好item8需要顯示的資料,並放入需要顯示的位置。這就是ListView的緩衝機制,總結起來就是一句話:需要時才顯示,顯示完就被會收到快取。ListView,GridView等資料顯示控制元件通過這種快取機制可以極大的節省系統資源。

.BaseAdapter

使用BaseAdapter比較簡單,主要是通過繼承此類來實現BaseAdapter的四個方法:

public int getCount(): 介面卡中資料集的資料個數;

public Object getItem(int position): 獲取資料集中與索引對應的資料項;

public long getItemId(int position): 獲取指定行對應的ID;

public View getView(int position,View convertView,ViewGroup parent): 獲取沒一行Item的顯示內容。


實戰操作ListView

實戰說明:建立一個簡易學生資訊(包含性別、姓名、序號資訊)

實戰方法如下:

   1.建立一個layout xml 並佈局完善id

   2.在主XML中新增一個ListView控制元件和部分按鈕,佈局完善id

  3.程式碼部分解讀:

建立Student資訊類

//自定義Student類
private class Student
{
    String name;
    boolean sex;
    int id;
    public Student(String name,boolean sex,int id)
    {
        this.name=name;
        this.sex=sex;
        this.id=id;
    }

}

定義介面卡

//定義adapter
private class MyListAdapter extends BaseAdapter
{
    // 男女圖示
    Drawable[] icons = new Drawable[2];

    public MyListAdapter()
    {
        icons[0] = MainActivity.this.getDrawable(R.drawable.ic_female);
        icons[1] = getDrawable(R.drawable.ic_male);
    }

    @Override
    public int getCount()
    {
        // 一共多少項
        return listData.size();
    }

    @Override
    public Object getItem(int position)
    {
        // 獲取每一項的資料
        return listData.get(position);
    }

    @Override
    public long getItemId(int position)
    {
        // 獲取某項對應的內部ID, 如果不需要,則直接把position作為ID
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        // 建立控制元件
        if (convertView == null)
        {
            //將自定義layout xml(list_item_student)新增給convertView
            convertView = getLayoutInflater()
                    .inflate(R.layout.list_item_student, parent, false);
        }
        // 獲取資料
        Student data = (Student) getItem(position);
        // 顯示資料
        TextView textView = (TextView) convertView.findViewById(R.id.id_textview);
        textView.setText(data.name+"("+data.id+")");

        ImageView imageView = (ImageView)convertView.findViewById(R.id.id_imageview);
        if (data.sex)
            imageView.setImageDrawable(icons[1]);
        else
            imageView.setImageDrawable(icons[0]);

        return convertView;
    }
}

使用adapter

//Activity主頁中
@Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
         // 準備資料
        listData.add(new Student("小張", true));
        listData.add(new Student("小王", false));
        listData.add(new Student("小李", true));

        //準備介面卡
        MyListAdapter adapter=new MyListAdapter();

        //新增adapter
        ListView listview=(ListView)findViewById(R.id.id_listView);
        listview.setAdapter(adapter);

    }

效果圖顯示

展示的效果圖另外還添加了一些功能,但是基本的框架跟以上介紹的是一樣的。想要這個原碼的可以私聊我喲(免費滴嘛)

謝謝觀看,歡迎評論(如有不對,及時指教)