简单来说,ListView就是一个可以竖直滚动的列表,列表里边的内容是由一个条目一个条目组成,这些条目的都差不多相同,且内容都来自Adapter(适配器)。
在布局里面使用ListView:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ListView
android:id="@+id/lv_listview"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</RelativeLayout>
在代码中通过findViewById()找到控件listview,开始设置数据适配器,而设置数据适配器有三种方式
1.创建一个类实现ListAdapter接口,需要实现12个未实现的方法,太麻烦,所以我们一般继承ListAdapter的一个实现类BaseAdapter,只需要实现四个抽象方法即可。
这四个方法种getCount()方法的作用是控制ListView显示的条目数,getView()方法是每一个条目里面展示的内容,getItem()方法是获取其中的某一个条目的数据集,getItemId()方法是指获取某一条目在整个条目中所在的位置,就是索引。
代码如下:
public class MainActivity extends Activity {
private ListView lv_listview;
private BaseAdapter adapter;
/**
* 展示图片的数组
*/
private int[] image={R.drawable.c,R.drawable.h,R.drawable.i,R.drawable.j};
/**
* 描述的集合
*/
private List<String> details;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
initView();
}
/**
* 初始化数据
*/
private void initData() {
details = new ArrayList<String>();
for (int i = 1; i < image.length+1; i++) {
details.add("这是第"+i+"张漂亮图片");
}
}
/**
* 初始化view
*/
private void initView() {
lv_listview = (ListView) findViewById(R.id.lv_listview);
lv_listview.setAdapter(adapter=new BaseAdapter() {
//利用viewholder优化listview
ViewHolder viewholder=null;
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//复用convertView历史对象
if(convertView==null){
viewholder=new ViewHolder();
convertView= View.inflate(parent.getContext(), R.layout.layout_item, null);
convertView.setTag(viewholder);
}else{
viewholder = (ViewHolder) convertView.getTag();
}
//寻找控件
viewholder.tv_detail= (TextView) convertView.findViewById(R.id.tv_detail);
viewholder.iv_icon = (ImageView) convertView.findViewById(R.id.iv_icon);
//设置view的数据
viewholder.iv_icon.setImageResource(image[position]);
viewholder.tv_detail.setText(details.get(position));
//返回一个条目的对象
return convertView;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public Object getItem(int position) {
return getItem(position);
}
@Override
public int getCount() {
//返回图片数组的长度,即显示的item的条数
return image.length;
}
});
}
/**
* 静态内部类,只用加载一次
*/
static class ViewHolder{
TextView tv_detail;
ImageView iv_icon;
}
}
效果展示:
2.使用ArrayAdapter来适配数据,ArrayAdapter里面的四个参数分别代表的含义
参数一:上下文对象
参数二:条目的布局资源
参数三:布局里面的控件id
参数四:存储数据的object类型的集合。
其他的5个重构方法不再一一描述。
代码如下:
public class MainActivity extends Activity {
private ListView lv_listview;
/**
* 描述的集合
*/
private List<String> details;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
initView();
}
/**
* 初始化数据
*/
private void initData() {
details = new ArrayList<String>();
for (int i = 1; i <10; i++) {
details.add("这是第"+i+"个条目");
}
}
/**
* 初始化view
*/
private void initView() {
lv_listview = (ListView) findViewById(R.id.lv_listview);
ArrayAdapter<String> adapter = new ArrayAdapter<String>(getApplicationContext(), R.layout.layout_item, R.id.tv_detail,details);
lv_listview.setAdapter(adapter);
}
}
3.最后说说第三种,用simpleAdapter适配数据,不过这个用着比较麻烦一点
参数1:上下文
参数2:Map列表,列表要显示的数据,类型要与上面的一致,每个条目要与from中指定条目一致
参数3:就是每个条目展示数据的布局资源
参数 4: 就是map集合中的存储的key
参数 5:是一个int数组,数组里面的id是布局中展示数据的控件的id,需要与第4个参数一一对应
public class MainActivity extends Activity {
private ListView lv_listview;
private List<Map<String, String>> data;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
initView();
}
/**
* 初始化数据
*/
private void initData() {
data = new ArrayList<Map<String,String>>();
Map<String, String> map1 = new HashMap<String, String>();
map1.put("name","张飞");
map1.put("phone", "119");
Map<String, String> map2 = new HashMap<String, String>();
map2.put("name","赵云");
map2.put("phone", "120");
Map<String, String> map3 = new HashMap<String, String>();
map3.put("name","貂蝉");
map3.put("phone", "114");
data.add(map1);
data.add(map2);
data.add(map3);
}
/**
* 初始化view
*/
private void initView() {
lv_listview = (ListView) findViewById(R.id.lv_listview);
SimpleAdapter adapter = new SimpleAdapter(getApplicationContext(), data, R.layout.layout_item, new String[]{"name","phone"}, new int[]{R.id.tv_name,R.id.tv_detail});
lv_listview.setAdapter(adapter);
}
}