ListView这个控件在Android开发中用到非常频繁,基本上是个应用都会到,它以列表的形式来展示一些数据,本篇博客只是一个是简单实例,来帮助初学者理解ListView,不涉及到性能优化。
要想使用ListView这个控件,必须要具备三个条件:ListView控件、数据源、数据适配器(xxxAdpater)。
1.ListView控件
这个就不用多说了,就是在布局文件中添加一个ListView
2.数据源
你可以理解为一个存放数据的容器,它可以存放不同类型的数据。它可以是一个String类型的数组:
String[] datas = {"刘备","关羽","张飞","赵云","黄忠","马超"};
也可以是一个Map所组成的List集合:
List<Map<String,Object>> datas = new ArrayList<Map<String,Object>>()
。。。。。。
3.数据适配器(重点,难点)
适配器是个什么鬼呢?初学者可以把他理解成一个将数据从数据源传输到视图控件(TextView,ImageView等)的一个”通道“,Android中的适配器有很多,这里简单介绍几个最常用的:
1.ArrayAdapter
是最简单的一种适配器,它只能适配文字信息
2.SimpleAdapter
从字面上理解感觉它很”Simple“,实际上它是强大的,它的高扩展性可以支持绝大部分数据的适配。
3.SimpleCursorAdapter
可以认为是SimpleAdapter对数据库的简单结合,可以方便的把数据库的内容以列表的形式展示出来;
4.BaseAdapter
前两者的父类,要使用它必须需要自定义类继承它,重写它的一些方法,通过这种方法我们可以实现更复杂的布局,更灵活,更高效。
好了,理解了这些我们就可以开始写代码了,今天我们主要通过前面两个适配器来实现ListView。。。o(^▽^)o
一,通过ArrayAdapter实现ListView
思路:
1.实例化一个ListView控件
2.创建一个数据源
3.实例化一个ArrayAdapter
4.为ListView设置适配器
代码:
package com.example.lowp.listview_test;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
/**
* Created by Lowp on 2015/9/10.
*/
public class ArrayAdapterActivity extends Activity{
private ArrayAdapter<String> adapter;
private String[] datas = {"刘备","关羽","张飞","赵云","黄忠","马超"};
private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.array_activity);
/**
* 1.实例化一个ListView控件
* 2.创建一个数据源
* 3.实例化一个ArrayAdapter
* 4.为ListView设置适配器
*/
listView = (ListView) findViewById(R.id.arrayListView);
/**
* 初始化适配器
*
* 参数说明
* Context context : 上下文对象
*
* int resource : ListView的item布局文件的ID
*
* String[] objects : 数据源,String数组类型的数组
*/
adapter = new ArrayAdapter<String>(ArrayAdapterActivity.this,android.R.layout.simple_list_item_1,datas);
listView.setAdapter(adapter);
}
}
二,通过SimpleAdapter实现ListView
思路:
和上面一样。。。
代码:
package com.example.lowp.listview_test;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by Lowp on 2015/9/10.
*/
public class SimpleAdapaterActivity extends Activity implements AdapterView.OnItemClickListener,AbsListView.OnScrollListener{
private ListView listView;
private SimpleAdapter adapter;
private List<Map<String,Object>> datas = new ArrayList<Map<String,Object>>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.simple_activity);
listView = (ListView) findViewById(R.id.simpleListView);
/**
* 初始化适配器
*
* 参数说明
*
* Context context :运行SimpleAdapter的上下文对象
*
* List<?extends Map<String,?>> data :数据源,一个Map所组成的List集合。其中,
* 每一个Map都会对应ListView列表中的一行,
* 每一个Map(键值对)中的键必须包含所在“from”
* 中的指定的键
*
* int resource :ListView的item布局文件的id,这个布局中必须包括了"to"中的控件
*
* String[] from :Map中的键名
*
* int to :"int resource"中控件的id;将“from”得到的数据显示到"int resource"对应
* 的控件中,第N个数据,对应第N个控件(id的顺
* 序必须与from中的键名顺序一一对应)
*
*/
adapter = new SimpleAdapter(SimpleAdapaterActivity.this,getData(),R.layout.simple_item
,new String[]{"img","text","author"},new int[]{R.id.img,R.id.text,R.id.author});
listView.setAdapter(adapter);
}
public List<Map<String,Object>> getData(){
for(int i = 0; i < 20; i++){
Map<String,Object> map = new HashMap<String,Object>();
map.put("img",R.mipmap.ic_launcher);
map.put("text","三国演义" + (i+1));
map.put("author","罗贯中");
datas.add(map);
}
return datas;
}