# 关于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

# 二. 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