Android學習筆記(9)——ListView簡介,androidlistview
ListView作為Android上幾乎使用最多的控制項,一定是要好好掌握的。這裡介紹一些ListView的基礎知識和特點,並提供一個簡單的範例。
首先,我們來定義下layout:
?
| 123456789101112131415 |
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/ll_root" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.listview.MainActivity"> <ListView android:id="@+id/lv" android:layout_width="match_parent" android:layout_height="match_parent"> </ListView> </LinearLayout> |
介面很簡單,只是一個線性布局加上一個ListView控制項,接下來是資料顯示的問題,這裡要說一下Android下的Adapter(資料配接器),一個Adapter可以看成是 ListView 的資料來源, ListView 要展示的資料都是以Adapter的形式傳遞給 ListView 的。
關於Adapter的具體知識,在之後的文章會單獨講到。
要注意的是,ListView的設計也是遵從的MVC模式,即:
M model 資料模型(要顯示的資料項目類型)
V View 即Listview
C Controller 即Adapter
我們來看看具體代碼如何?:首先是onCreate方法:
?
| 123456789 |
protectedvoid onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lv = (ListView) findViewById(R.id.lv); for(inti=0;i<50;i++){ strList.add("我是條目"+i); } lv.setAdapter(newMyAdapter()); } |
要讓Listview顯示出條目,只需要調用lv.setAdapter方法即可,只是這裡面的MyAdapter類需要我們自己去寫,這裡我們可以通過繼承的方法來實現。這裡介紹的是基本的BaseAdapter,以後的文章會逐步介紹其他的適配器:
//預設實作類別,一般以: Base Simple default開頭
private class MyAdapter extends BaseAdapter{
private static final String TAG = “MyAdapter”;
/**
* 控制ListView裡面總共有多少個條目
*/
@Override
public int getCount() {
return strList.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Log.i(TAG, “返回view對象,位置”+position);
TextView tv = new TextView(getApplicationContext());
tv.setTextSize(20);
//擷取對應位置的str資訊
String str = strList.get(position);
tv.setText(str);
return tv;
}
}
要實現簡單的顯示功能,只用完成其中的兩個方法即可,一個是getView,即返回一個要顯示的view,另外是getCount,即返回總的條目數。
另外關於 ListView要注意的是,在程式執行的時候,ListView會根據螢幕顯示的長度來自動決定要產生的view對象的數量,即不在螢幕範圍內的view對象是不會產生的,只有等到快要滾動到的時候才自動產生。另外已經存在的對象如果被滾動走了,會通過Java的記憶體回收行程處理掉這一對象。
這樣的好處就是,假如整個程式有很多很多個條目,系統不會一次性的全部產生view對應的對象,能夠提高程式效能,防止記憶體溢出。
完整代碼:
?
| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
packagecom.example.listview; importjava.util.ArrayList;importjava.util.List; importandroid.app.Activity;importandroid.database.DataSetObserver;importandroid.nfc.Tag;importandroid.os.Bundle;importandroid.util.Log;importandroid.view.View;importandroid.view.ViewGroup;importandroid.widget.Adapter;importandroid.widget.BaseAdapter;importandroid.widget.ListAdapter;importandroid.widget.ListView;importandroid.widget.TextView; publicclass MainActivity extends Activity { privatestatic final String TAG = "MainActivity"; privateListView lv; privateList<String> strList = newArrayList<String>(); @Override protectedvoid onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); lv = (ListView) findViewById(R.id.lv); for(inti=0;i<50;i++){ strList.add("我是條目"+i); } lv.setAdapter(newMyAdapter()); } //預設實作類別,一般以: Base Simple default開頭 privateclass MyAdapter extends BaseAdapter{ privatestatic final String TAG = "MyAdapter"; /** * 控制ListView裡面總共有多少個條目 */ @Override publicint getCount() { returnstrList.size(); } @Override publicObject getItem(intposition) { returnnull; } @Override publiclong getItemId(int position) { return0; } @Override publicView getView(intposition, View convertView, ViewGroup parent) { Log.i(TAG,"返回view對象,位置"+position); TextView tv =new TextView(getApplicationContext()); tv.setTextSize(20); tv.setTextColor(Color.BLACK); //擷取對應位置的str資訊 String str = strList.get(position); tv.setText(str); returntv; } } } |
效果:
歡迎轉載,請註明出處。
搬運自本人部落格,xge技術部落格:
http://www.xgezhang.com/android_listview_intro.html