韩国三级高清手机在线版-韩国三级电影久久-韩国三级hd中文字幕一男多女-韩国三级hd中文字幕久久精品-日本精品在线视频-日本精品在线观看视频

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

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

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

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

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

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

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

 我們從最簡單的ListView開始:

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/**
 * @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并且定義一個布局文件(當然也可以使用系統自帶的)。

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/**
 * @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);
    }
    
    
}

 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

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?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>
 
 
</LinearLayout>

下面是實現代碼:

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/**
 * @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

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?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>

程序代碼:

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/**
 * @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了。

運行效果如下圖:

 

穩定

產品高可用性高并發

貼心

項目群及時溝通

專業

產品經理1v1支持

快速

MVP模式小步快跑

承諾

我們選擇聲譽

堅持

10年專注高端品質開發
  • 返回頂部
精品综合久久久久久888蜜芽| 男女无遮挡高清视频免费看| AV人摸人人人澡人人超碰小说| 国产盗摄XXXX视频XXXX| 中文字幕AⅤ人妻一区二区| 无码一区二区三区在线观看| 亚洲色欲综合一区二区三区小说| 97色偷偷色噜噜狠狠爱网站97| 亚洲国模337P人艺体艺术| 少妇内射高潮福利炮| 女人浓毛巨茎ⅩXXOOO| 久久久国产精品消防器材| 国产无遮挡裸露视频免费| 粗大在少妇体内进进出出| AV老司机福利精品导航| 夜夜揉揉日日人人| 亚洲AV无码专区精品无码| 双人床上做剧烈运动可以吗| 欧美无人区码卡二卡3卡4乱码| 老头猛挺进小雯的体内视频 | 国产精品99久久99久久久动漫| 宝宝又大了1V1| 99久久婷婷国产综合精品| 伊人久久大香线蕉AV不卡| 亚洲色AV天天天天天天| 亚洲国产婷婷综合在线精品 | 国产精品久久久久久AV| 丰满妇女强高潮18ⅩXXXHD| 被CAO的合不拢腿| А√中文在线天堂| MAC水蜜桃色314| CSGO内射最强对手| YY6080久久亚洲精品| А√在线中文网新版地址在线| А√天堂网WWW在线搜索| 啊灬啊灬啊灬快灬高潮了霸总| ZOOM人与ZOOMWIDS| 成年女人A级毛片免费观看| 成人免费无码大片A毛片抽搐| 俄罗斯卖CSGO的网站| 高H纯肉放荡脏话H文合集| 国产成人午夜福利院| 国产精品一区二区国产馆蜜桃| 国产日产欧产精品精品首页| 好硬好湿好爽再深一点动态图片 | 久久国产乱子伦精品免费女人| 久久成人国产精品无码| 浪潮AV色综合久久天堂| 欧美顶级PPT免费模板网站 | 精产国品一二三产区区| 69国产成人精品午夜福中文| 亚洲熟妇人av一区二区三区| 亚洲国产精品久久久久秋霞1 | 全球AV集中精品导航福利| 欧产日产国产精品精品| 女人天堂亚洲AⅤ在线观看| 免费无码又爽又刺激激情视频软件 | 色老99久久九九爱精品| 少妇高潮喷潮久久久影院| 日本XXXXXXXXX69| 日产精品卡二卡三卡四妈妈的朋友 | 久久不见久久见WWW免费| 久久精品人妻中文系列葵司| 久久人与动人物A级毛片| 美女扒开腿让男人桶爽直播| 男女无遮挡XX00动态图1| 欧美肥肥婆另类XXXX000| 人妻色欲AV无码专区精油按摩| 日韩乱码人妻无码中文字幕久久 | 99热热久久这里只有精品68| xxxx国产精品| 隔壁邻居是巨爆乳寡妇| 国产精品一区二区香蕉| 国产女人高潮抽搐喷水视频| 国产做国产爱免费视频| 精品人亚洲成A人片在线观看无码专区| 久久人妻少妇嫩草AV无码专区| 免费无码午夜福利片| 人人妻人人爽人人澡欧美一区| 色欲老女人人妻综合网| 性色AV一区二区三区夜夜嗨| 亚洲清清爽爽AABB| 24种男女插秧法| 成人片黄网站色大片免费观看CN| 车后车座的疯狂的做的视频| 国产精品高潮AV久久无码| 精品国产一区二区三区色欲| 精品少妇爆乳无码av专用区| 精品人妻无码视频一区二区三区 | 欧美熟老熟妇色XXXXX| 人妻少妇-嫩草影院| 污污网站18禁在线永久免费观看| 亚洲AV永久无码精品秋霞电影影院 | 天天做天天爱夜夜爽毛片毛片| 亚洲AV无码一区二区三区电影| 伊人久久大香线蕉午夜| 中国国产高清免费AV片| 凹凸女BBWBBWBBWBBW| 国产精品久久久天天影视香蕉| 精品无人区卡卡卡卡卡二卡三乱码 | 成人羞羞视频免费网站| 国产日产欧产精品精品推荐| 久久综合亚洲色HEZYO国产| 欧美黑人乱猛交xX 乂500| 熟妇的荡欲BD高清| 亚洲色大成网站WWW久久| JAPANESEⅩⅩⅩHD69| 国产精品无码A∨麻豆| 久久久精品国产SM最大网站| 拍摄AV现场失控高潮数次| 无码中文亚洲AV影音先锋无码| 夜夜高潮夜夜爽国产伦精品| 成年免费A级毛片| 精品无码AV无码免费专区| 人妻丰满熟妇AV无码| 亚洲AV极品无码专区亚洲AV | 国产AV无码专区亚洲AVJUL| 精品无码久久久久久尤物| 朋友的人妻的滋味BD高清中文| 亚洲AV噜噜在线成人网站| 中文字幕日本六区小电影| 国产成A人片在线观看视频| 久久996RE热这里有精品| 琴乳液狂飙却被空吸入口中| 亚洲AV无码一区二区三区人| AV鲁丝一区鲁丝二区鲁丝四| 国产亚洲精久久久久久无码| 蜜桃传媒一区二区亚洲AV | 无码人妻精品一区二区三区99仓 | 无码人妻熟妇av又粗又大| 无码毛片内射白浆视频| 野花日本大全免费观看中文7| 成年女人午夜毛片免费视频| 精品人妻少妇一区| 欧美熟妇内射深插| 亚洲爆乳成AV人在线蜜芽| 啊灬啊灬啊灬快灬深视频无遮掩 | 高潮毛片无遮挡高清免费| 久久精品国产亚洲AV麻豆色欲| 强开小娟嫩苞又嫩又紧| 亚洲国产精品无码久久98| 苍井空张开腿实干12次| 久久精品人妻一区二区三区一| 色欲久久久天天天综合网精品| 呦系列视频一区二区三区| 国产精品VIDEOSSEX国产| 女人浓毛巨茎ⅩXXOOO毛绒绒| 亚洲AV午夜成人片动漫番| 成 人 免 费 黄 色 网站无| 久久久久人妻一区二区三区VR| 同性男男黄网站在线观看国外| 真人作爱90分钟免费看视频| 国产三级精品三级在线专区1| 漂亮人妻被强玩波多野结衣 | 日本少妇人妻XXXXⅩ18| 亚洲国产在一区二区三区| 高潮和狂野射精合集| 男人扒开女人下面猛进猛出| 亚洲国产精品无码久久久动漫| 国产A1A2A3| 欧美激欧美啪啪片免费看| 亚洲欧洲日产国码AⅤ| 国产AV永久精品无码| 欧美野外疯狂做受XXXX高潮| 亚洲中文字幕日本无线码| 国产情侣一区二区三区| 日韩欧美视频一区二区| 4399理论片午午伦夜理片| 精品人妻一区二区三区四区在线 | 无码国产乱人伦偷精品视频| JZZIJZZIJ亚洲乱熟无码| 乱精品一区字幕二区| 亚洲国产精品久久久久婷婷软件| 国产V综合V亚洲欧美久久| 人妻无码ΑV中文字幕久久| 中文在线っと好きだった| 精品亚洲成A人片在线观看少妇| 私密按摩高潮熟女啪啪 | 国产在线精品二区| 爽到高潮无码视频在线观看| JUX900被公每天侵犯的我| 美女扒开奶罩露出奶头视频网站| 亚洲AV无一区二区三区| 国产精品久久久久久精品电影| 人妻在夫面前被性爆| 18大禁漫画吃奶羞羞漫画| 久久精品亚洲精品无码| 亚洲国产AV无码精品| 国产高潮刺激叫喊视频| 人善交VIDEO另类HD| 99精产国品一二三产区区别网站 | 欧美最猛黑人XXXⅩ猛男视频 | 99久久99久久精品国产片| 老师黑色丝袜被躁翻了AV| 亚洲欧美黑人深喉猛交群| 黑人巨鞭大战丰满少妇| 性生交片免费无码看人| 国产乱子伦高清露脸对白| 无码人妻精品中文字幕免费| 国产成人精品无码专区|