# 关于ListView及GridView
TIP
本节内容:
一. ListView
1.ListView用途;
2.数据适配器;
3.掌握两个与ListView相关的监听器;
二. GridView
1.GridView用途;
2.实现过程;
# 一. ListView
1.ListView用途;
作用:android系统中用于显示列表的控件 介绍:每一个ListView都可以包含很多个列表项,至于先是多少个列表项则由数据源决定。
2.数据适配器
作用:把复杂的数据(数组、链表、数据库、集合等)填充在试图界面上。
一句话总结:适配器是连结数据源与视图界面的桥梁
常用的有两种:
(1)ArrayAdapter
(数组适配器):用于绑定格式单一的数据
数据源可以是:集合或数组
(2)SimpleAdapter
(简单适配器):用于绑定格式复杂的数据
数据源只能是:特定泛型的集合
实现过程:新建适配器
-->添加数据源到适配器
-->视图加载适配器
3.掌握两个与ListView相关的监听器:
OnItemClickListener
:可以处理视图中单个条目的点击事件。
OnScrollListener
:检测滚动的变化,可以用于视图在滚动中加载数据。
另附关于监听器一句话总结:
监听器是程序和用户(或系统)交互的桥梁。
附代码:
/**
* 这是作为LixtView展示的窗口
*/
public class NextActivity extends Activity implements AdapterView.OnItemClickListener,AbsListView.OnScrollListener {
private ListView listView;
// private ArrayAdapter<String> arrayAdapter;
private SimpleAdapter simpleAdapter;
private List<Map<String,Object>> dataList;
private Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.data_list);
intent = new Intent();
intent.setClass(NextActivity.this, GridViewActivity.class);
listView = (ListView) findViewById(R.id.listView);
//为listView绑定监听器
listView.setOnItemClickListener(this);
listView.setOnScrollListener(this);
//数据适配器 开始
//1.新建一个数据适配器
//ArrayAdapter<String>(上下文(也就是当前的Activity), 当前ListView加载的每一个列表项所对应的布局文件 ,含有数据源的数组);
//2.为适配器加载数据源
// String[] array = {"12345","23456","34567","45678","56789"};
// arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1 ,array);
// //3.视图(ListView)加载适配器
// listView.setAdapter(arrayAdapter);
//数据适配器 结束
//上面是数据适配器
//下面是简单适配器
//SimpleAdapter(Context context,
//List<? extends Map<String, ?>> data,@LayoutRes int resource, String[] from, @IdRes int[] to)
//context:上下文
//data:数据源List<? extends Map<String, ?>> 一个Map所组成的List集合
// 每一个Map都会去对应ListView列表中的一行
// 每一个Map(键-值对)中的键必须包含所有在from中所指定的键
//resource:列表项的布局文件ID
//from:Map中的键名
//to;绑定数据视图中的ID,与from成对应关系
dataList = new ArrayList<Map<String,Object>>();
simpleAdapter = new SimpleAdapter(this,
getData(),
R.layout.item,
new String[]{"img","title_tel","text_title","hui","price"},
new int[]{R.id.img,R.id.title_tel,R.id.text_title,R.id.hui,R.id.price,});
listView.setAdapter(simpleAdapter);
}
/**
* 获取数据源的方法
* @return 数据的集合
*/
private List<Map<String,Object>> getData(){
for (int i = 0; i < 10; i++) {
Map<String,Object> map = new HashMap<String,Object>();
map.put("img",R.drawable.thumb);
map.put("title_tel","色香味俱全"+i);
map.put("text_title","新疆大盘鸡"+i);
map.put("hui","优惠:"+i+"元");
map.put("price","均价:"+i+"元");
dataList.add(map);
}
return dataList;
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
String text = listView.getItemIdAtPosition(position) + "";
String content = "position:"+position+",text:"+text;
//第一个参数是上下文,第二个参数是文本信息,第三个是Toath打印的时长
// Toast.makeText(this,content,Toast.LENGTH_SHORT).show();
//putExtra()方法类似于Map中的put()方法,存入的是一对键值对。
intent.putExtra("com.wencheng.imoocclassnotes.NextActivity.onItemClick", content);
startActivity(intent);
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
switch (scrollState)
{
case SCROLL_STATE_FLING:
Log.i("Main","用户用力划了一下,手指已经离开屏幕,但由于惯性视图仍然在滑动");
break;
case SCROLL_STATE_IDLE:
Log.i("Main","试图已经停止滑动");
// 判断是否滚动到底部
if (view.getLastVisiblePosition() == view.getCount() - 1) {
//加载更多功能的代码
//此时还需动态更新数据源,重新更新到UI线程里面(也就是主线程界面)
Map<String,Object> map = new HashMap<String,Object>();
int count = view.getCount();
map.put("img",R.drawable.thumb);
map.put("title_tel","色香味俱全"+count);
map.put("text_title","新疆大盘鸡"+count);
map.put("hui","优惠:"+count+"元");
map.put("price", "均价:"+count+"元");
dataList.add(map);
simpleAdapter.notifyDataSetChanged();//这个方法就是通知UI线程重新刷新一下界面
Log.i("Test","加载了数据");
}
break;
case SCROLL_STATE_TOUCH_SCROLL:
Log.i("Main","手指没有离开屏幕,视图仍然在滑动");
break;
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
}
}
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
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
# 二. GridView
1.GridView用途;
GridView用于在界面上按行、列分布的方式来显示多个组件。
与ListView不同的是:
ListView是一维的数据表现形式,而GridView是二维布局界面。
2.实现过程;
准备数据源
-->新建适配器
-->添加数据源到适配器
-->视图加载适配器
。
附代码:
/**
* 这是用于做GridView展示的窗口
*/
public class GridViewActivity extends Activity implements AdapterView.OnItemClickListener{
private GridView gridView;
private List<Map<String,Object>> dataList;
private int[] icon;
private String[] iconName;
private SimpleAdapter simpleAdapter;
private String content_chuan;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.gridview_three);
Intent intent = getIntent();
content_chuan = "传过来的值==" + intent.getStringExtra("com.wencheng.imoocclassnotes.NextActivity.onItemClick");
Toast.makeText(this,content_chuan, Toast.LENGTH_LONG).show();
gridView = (GridView) findViewById(R.id.gridView);
icon = new int[]{R.drawable.address_book,R.drawable.calendar,R.drawable.camera,
R.drawable.clock, R.drawable.games_control,R.drawable.messenger,
R.drawable.ringtone,R.drawable.settings,R.drawable.speech_balloon,
R.drawable.weather,R.drawable.world,R.drawable.youtube};
iconName = new String[]{"通讯录","日历","照相机","时钟","游戏",
"短信","铃声","设置","语音","天气","浏览器","视频"};
dataList = new ArrayList<Map<String,Object>>();
simpleAdapter = new SimpleAdapter(this,getData(),R.layout.gridview_item,
new String[]{"image","imgText"},new int[]{R.id.imageIcon,R.id.imgText});
gridView.setAdapter(simpleAdapter);
//一定要记住:必须得绑定这个监听器
gridView.setOnItemClickListener(this);
/*
1.准备数据源
2.新建适配器(SimpleAdapter)
3.GridView加载适配器
4.为GridView配置事件监听器,在此使用OnItemClickListener
*/
}
public List<Map<String,Object>> getData() {
for (int i = 0; i < icon.length; i++) {
Map<String,Object> map = new HashMap<String,Object>();
map.put("image",icon[i]);
// map.put("image",R.drawable.address_book);
map.put("imgText",iconName[i]);
dataList.add(map);
}
return dataList;
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {//这方法没用
//// String text = gridView.getItemIdAtPosition(position) + "";
//// String content = content_chuan + ",,,这是GridView的==position:"+position+",text:"+text;
//
Toast.makeText(this,"我是"+iconName[position], Toast.LENGTH_SHORT).show();
}
}
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
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