亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

android ListView深入理解

2020-04-11 12:41:14
字體:
來源:轉載
供稿:網友

  在android開發中ListView是比較常用的組件,它以列表的形式展示具體內容,并且能夠根據數據的長度自適應顯示。抽空把對ListView的使用做了整理,并寫了個小例子,如下圖。

 列表的顯示需要三個元素:

1.ListVeiw 用來展示列表的View。

2.適配器 用來把數據映射到ListView上的中介。

3.數據    具體的將被映射的字符串,圖片,或者基本組件。

根據列表的適配器類型,列表分為三種,ArrayAdapter,SimpleAdapter和SimpleCursorAdapter

其中以ArrayAdapter最為簡單,只能展示一行字。SimpleAdapter有最好的擴充性,可以自定義出各種效果。SimpleCursorAdapter可以認為是SimpleAdapter對數據庫的簡單結合,可以方面的把數據庫的內容以列表的形式展示出來。

 我們從最簡單的ListView開始:

復制代碼 代碼如下:

/**
* @author allin
*
*/
public class MyListView extends Activity {

private ListView listView;
//private List<String> data = new ArrayList<String>();
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);

listView = new ListView(this);
listView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1,getData()));
setContentView(listView);
}



private List<String> getData(){

List<String> data = new ArrayList<String>();
data.add("測試數據1");
data.add("測試數據2");
data.add("測試數據3");
data.add("測試數據4");

return data;
}
}

上面代碼使用了ArrayAdapter(Context context, int textViewResourceId, List<T> objects)來裝配數據,要裝配這些數據就需要一個連接ListView視圖對象和數組數據的適配器來兩者的適配工作,ArrayAdapter的構造需要三個參數,依次為this,布局文件(注意這里的布局文件描述的是列表的每一行的布局,android.R.layout.simple_list_item_1是系統定義好的布局文件只顯示一行文字,數據源(一個List集合)。同時用setAdapter()完成適配的最后工作。運行后的現實結構如下圖:

SimpleCursorAdapter

  sdk的解釋是這樣的:An easy adapter to map columns from a cursor to TextViews or ImageViews defined in an XML file. You can specify which columns you want, which views you want to display the columns, and the XML file that defines the appearance of these views。簡單的說就是方便把從游標得到的數據進行列表顯示,并可以把指定的列映射到對應的TextView中。

  下面的程序是從電話簿中把聯系人顯示到類表中。先在通訊錄中添加一個聯系人作為數據庫的數據。然后獲得一個指向數據庫的Cursor并且定義一個布局文件(當然也可以使用系統自帶的)。

/** * @author allin * */public class MyListView2 extends Activity {private ListView listView;//private List<String> data = new ArrayList<String>();@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);listView = new ListView(this);Cursor cursor = getContentResolver().query(People.CONTENT_URI, null, null, null, null);startManagingCursor(cursor);ListAdapter listAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_expandable_list_item_1, cursor,new String[]{People.NAME}, new int[]{android.R.id.text1});listView.setAdapter(listAdapter);setContentView(listView);}}

 Cursor cursor = getContentResolver().query(People.CONTENT_URI, null, null, null, null);先獲得一個指向系統通訊錄數據庫的Cursor對象獲得數據來源。

 startManagingCursor(cursor);我們將獲得的Cursor對象交由Activity管理,這樣Cursor的生命周期和Activity便能夠自動同步,省去自己手動管理Cursor。

 SimpleCursorAdapter 構造函數前面3個參數和ArrayAdapter是一樣的,最后兩個參數:一個包含數據庫的列的String型數組,一個包含布局文件中對應組件id的int型數組。其作用是自動的將String型數組所表示的每一列數據映射到布局文件對應id的組件上。上面的代碼,將NAME列的數據一次映射到布局文件的id為text1的組件上。

注意:需要在AndroidManifest.xml中如權限:<uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>

運行后效果如下圖:

SimpleAdapter

simpleAdapter的擴展性最好,可以定義各種各樣的布局出來,可以放上ImageView(圖片),還可以放上Button(按鈕),CheckBox(復選框)等等。下面的代碼都直接繼承了ListActivity,ListActivity和普通的Activity沒有太大的差別,不同就是對顯示ListView做了許多優化,方面顯示而已。

下面的程序是實現一個帶有圖片的類表。

首先需要定義好一個用來顯示每一個列內容的xml

vlist.xml

復制代碼 代碼如下:

/**
* @author allin
*
*/
public class MyListView2 extends Activity {

private ListView listView;
//private List<String> data = new ArrayList<String>();
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);

listView = new ListView(this);

Cursor cursor = getContentResolver().query(People.CONTENT_URI, null, null, null, null);
startManagingCursor(cursor);

ListAdapter listAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_expandable_list_item_1,
cursor,
new String[]{People.NAME},
new int[]{android.R.id.text1});

listView.setAdapter(listAdapter);
setContentView(listView);
}


}

下面是實現代碼:

復制代碼 代碼如下:

/**
* @author allin
*
*/
public class MyListView3 extends ListActivity {


// private List<String> data = new ArrayList<String>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

SimpleAdapter adapter = new SimpleAdapter(this,getData(),R.layout.vlist,
new String[]{"title","info","img"},
new int[]{R.id.title,R.id.info,R.id.img});
setListAdapter(adapter);
}

private List<Map<String, Object>> getData() {
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();

Map<String, Object> map = new HashMap<String, Object>();
map.put("title", "G1");
map.put("info", "google 1");
map.put("img", R.drawable.i1);
list.add(map);

map = new HashMap<String, Object>();
map.put("title", "G2");
map.put("info", "google 2");
map.put("img", R.drawable.i2);
list.add(map);

map = new HashMap<String, Object>();
map.put("title", "G3");
map.put("info", "google 3");
map.put("img", R.drawable.i3);
list.add(map);

return list;
}
}

使用simpleAdapter的數據用一般都是HashMap構成的List,list的每一節對應ListView的每一行。HashMap的每個鍵值數據映射到布局文件中對應id的組件上。因為系統沒有對應的布局文件可用,我們可以自己定義一個布局vlist.xml。下面做適配,new一個SimpleAdapter參數一次是:this,布局文件(vlist.xml),HashMap的 title 和 info,img。布局文件的組件id,title,info,img。布局文件的各組件分別映射到HashMap的各元素上,完成適配。

運行效果如下圖:

有按鈕的ListView

但是有時候,列表不光會用來做顯示用,我們同樣可以在在上面添加按鈕。添加按鈕首先要寫一個有按鈕的xml文件,然后自然會想到用上面的方法定義一個適配器,然后將數據映射到布局文件上。但是事實并非這樣,因為按鈕是無法映射的,即使你成功的用布局文件顯示出了按鈕也無法添加按鈕的響應,這時就要研究一下ListView是如何現實的了,而且必須要重寫一個類繼承BaseAdapter。下面的示例將顯示一個按鈕和一個圖片,兩行字如果單擊按鈕將刪除此按鈕的所在行。并告訴你ListView究竟是如何工作的。效果如下:

vlist2.xml

復制代碼 代碼如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent">


<ImageView android:id="@+id/img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="5px"/>

<LinearLayout android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content">

<TextView android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FFFFFFFF"
android:textSize="22px" />
<TextView android:id="@+id/info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FFFFFFFF"
android:textSize="13px" />

</LinearLayout>


<Button android:id="@+id/view_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/s_view_btn"
android:layout_gravity="bottom|right" />
</LinearLayout>

程序代碼:

復制代碼 代碼如下:

/**
* @author allin
*
*/
public class MyListView4 extends ListActivity {
private List<Map<String, Object>> mData;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mData = getData();
MyAdapter adapter = new MyAdapter(this);
setListAdapter(adapter);
}
private List<Map<String, Object>> getData() {
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
Map<String, Object> map = new HashMap<String, Object>();
map.put("title", "G1");
map.put("info", "google 1");
map.put("img", R.drawable.i1);
list.add(map);
map = new HashMap<String, Object>();
map.put("title", "G2");
map.put("info", "google 2");
map.put("img", R.drawable.i2);
list.add(map);
map = new HashMap<String, Object>();
map.put("title", "G3");
map.put("info", "google 3");
map.put("img", R.drawable.i3);
list.add(map);
return list;
}
// ListView 中某項被選中后的邏輯
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
Log.v("MyListView4-click", (String)mData.get(position).get("title"));
}
/**
* listview中點擊按鍵彈出對話框
*/
public void showInfo(){
new AlertDialog.Builder(this)
.setTitle("我的listview")
.setMessage("介紹...")
.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.show();
}
public final class ViewHolder{
public ImageView img;
public TextView title;
public TextView info;
public Button viewBtn;
}
public class MyAdapter extends BaseAdapter{
private LayoutInflater mInflater;
public MyAdapter(Context context){
this.mInflater = LayoutInflater.from(context);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return mData.size();
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if (convertView == null) {
holder=new ViewHolder();
convertView = mInflater.inflate(R.layout.vlist2, null);
holder.img = (ImageView)convertView.findViewById(R.id.img);
holder.title = (TextView)convertView.findViewById(R.id.title);
holder.info = (TextView)convertView.findViewById(R.id.info);
holder.viewBtn = (Button)convertView.findViewById(R.id.view_btn);
convertView.setTag(holder);
}else {
holder = (ViewHolder)convertView.getTag();
}
holder.img.setBackgroundResource((Integer)mData.get(position).get("img"));
holder.title.setText((String)mData.get(position).get("title"));
holder.info.setText((String)mData.get(position).get("info"));
holder.viewBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showInfo();
}
});
return convertView;
}
}
}

  下面將對上述代碼,做詳細的解釋,listView在開始繪制的時候,系統首先調用getCount()函數,根據他的返回值得到listView的長度(這也是為什么在開始的第一張圖特別的標出列表長度),然后根據這個長度,調用getView()逐一繪制每一行。如果你的getCount()返回值是0的話,列表將不顯示同樣return 1,就只顯示一行。

  系統顯示列表時,首先實例化一個適配器(這里將實例化自定義的適配器)。當手動完成適配時,必須手動映射數據,這需要重寫getView()方法。系統在繪制列表的每一行的時候將調用此方法。getView()有三個參數,position表示將顯示的是第幾行,covertView是從布局文件中inflate來的布局。我們用LayoutInflater的方法將定義好的vlist2.xml文件提取成View實例用來顯示。然后將xml文件中的各個組件實例化(簡單的findViewById()方法)。這樣便可以將數據對應到各個組件上了。但是按鈕為了響應點擊事件,需要為它添加點擊監聽器,這樣就能捕獲點擊事件。至此一個自定義的listView就完成了,現在讓我們回過頭從新審視這個過程。系統要繪制ListView了,他首先獲得要繪制的這個列表的長度,然后開始繪制第一行,怎么繪制呢?調用getView()函數。在這個函數里面首先獲得一個View(實際上是一個ViewGroup),然后再實例并設置各個組件,顯示之。好了,繪制完這一行了。那再繪制下一行,直到繪完為止。在實際的運行過程中會發現listView的每一行沒有焦點了,這是因為Button搶奪了listView的焦點,只要布局文件中將Button設置為沒有焦點就OK了。

運行效果如下圖:

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品久久7777777| 亚洲r级在线观看| 亚洲欧美激情在线视频| 精品亚洲va在线va天堂资源站| 欧美乱妇高清无乱码| 午夜精品久久久久久99热软件| 亚洲国模精品私拍| 欧美日韩国产一区中文午夜| 亚洲精品久久久一区二区三区| 日韩视频免费大全中文字幕| 成人淫片在线看| 欧美日韩亚洲视频| 成人黄色av免费在线观看| 午夜精品一区二区三区av| 国产精品亚洲片夜色在线| 免费97视频在线精品国自产拍| 欧美日韩成人在线视频| 成人黄色免费看| 久久久久久成人| 国产精品视频xxx| 美乳少妇欧美精品| 成人黄色片网站| 精品网站999www| 国产精品露脸av在线| 在线观看久久av| 欧美日韩福利在线观看| 亚洲综合精品伊人久久| 日本91av在线播放| 日韩欧美综合在线视频| 亚洲网站在线看| 中文欧美日本在线资源| 亚洲国产精品人久久电影| 亚洲一区二区自拍| 成人激情视频在线播放| 国产精品久久久久久五月尺| 亚洲毛片在线看| 久久久久久久91| 欧美大片va欧美在线播放| 欧美老女人在线视频| 日本不卡视频在线播放| 国产精品十八以下禁看| 欧美日韩国产中文精品字幕自在自线| 日韩中文字幕不卡视频| 亚洲国产精品视频在线观看| 午夜精品久久久99热福利| 色在人av网站天堂精品| 91av国产在线| 久久久久久久久久国产精品| 亚洲视频在线观看| 疯狂做受xxxx欧美肥白少妇| 国产成人精品综合久久久| 亚洲sss综合天堂久久| 清纯唯美亚洲综合| 超薄丝袜一区二区| 日韩av手机在线| 欧美激情啊啊啊| 精品亚洲一区二区三区在线观看| 91伊人影院在线播放| 欧美激情高清视频| 91天堂在线观看| 日本午夜人人精品| 日韩成人在线网站| 亚洲性线免费观看视频成熟| 国产欧美韩国高清| 欧美亚洲国产日本| 97久久精品视频| 国产精品美女网站| 欧美福利在线观看| 亚洲色图色老头| 欧美激情第1页| 久久久久久国产精品三级玉女聊斋| 国产精品久久久久久亚洲调教| 国产精品吊钟奶在线| 欧美性猛交xxxx黑人| 国产中文欧美精品| 亚洲国产精品嫩草影院久久| 91精品久久久久久久久久久久久| 97在线视频免费播放| 92福利视频午夜1000合集在线观看| 久久精品一本久久99精品| 97在线观看免费高清| 日韩欧美国产黄色| 中文字幕亚洲欧美日韩在线不卡| 欧美一区二区三区精品电影| 青青草99啪国产免费| 午夜精品久久久久久99热软件| 最新亚洲国产精品| 日韩av中文在线| 亚洲一区二区三区四区在线播放| 亚洲精品成人久久电影| 日韩精品极品在线观看| 亚洲成人精品在线| 国产亚洲精品91在线| 一区二区三区无码高清视频| 亚洲激情成人网| 国产一区二区三区三区在线观看| 97在线观看视频国产| 亚洲精品中文字| 91探花福利精品国产自产在线| 原创国产精品91| 日本人成精品视频在线| 国产一区二区三区视频免费| 一本一本久久a久久精品牛牛影视| 亚洲精品一区在线观看香蕉| 国产成人一区二区在线| 日韩免费在线视频| 亚洲毛片在线看| 亚洲在线免费视频| 国产精品自拍偷拍| 91久久精品国产91久久| 亚洲成人免费在线视频| 欧美有码在线观看视频| 日韩成人中文字幕在线观看| 亚洲精品一区二三区不卡| 久久全球大尺度高清视频| 日韩美女在线看| 美女视频黄免费的亚洲男人天堂| 97精品欧美一区二区三区| 色综合亚洲精品激情狠狠| 久久精彩免费视频| 国产在线不卡精品| 亚洲人高潮女人毛茸茸| 91亚洲精品一区二区| 国产精品福利在线观看网址| 日韩中文字幕视频在线| 国产精品免费一区二区三区都可以| 日韩精品久久久久| 亚洲人成电影在线| 成人中文字幕+乱码+中文字幕| 欧美成人第一页| 久久久中文字幕| 亚洲精品v欧美精品v日韩精品| 亚洲精品在线不卡| 欧美在线xxx| 精品福利视频导航| 日韩av中文字幕在线播放| 国产精品xxxxx| 久久久精品在线观看| 亚洲国产精品成人av| 国产一区二区激情| 国自产精品手机在线观看视频| 国产精品久久久久aaaa九色| www.xxxx欧美| 久久五月天综合| 另类少妇人与禽zozz0性伦| 91深夜福利视频| 日韩欧美精品网站| 91av视频在线免费观看| 国产亚洲一级高清| 岛国av午夜精品| 久久av在线播放| 日韩视频一区在线| 日韩av手机在线| 久久亚洲精品中文字幕冲田杏梨| 国产精品视频网址| 亚洲人线精品午夜| 亚洲第一天堂无码专区| 亚洲伦理中文字幕| 国产专区欧美专区| 欧美激情综合色| 国产日韩欧美在线看| 国产精品成人av在线| 91久久国产精品91久久性色| 国产在线观看91精品一区|