listview的简单使用

来源:互联网 发布:并发编程实战豆瓣 编辑:程序博客网 时间:2024/06/07 06:16

我们经常会在应用程序中使用列表的形式来展现一些内容,ListView就是用来展示这些信息的控件。要使用ListView,首先要了解什么是适配器。适配器是一个连接数据和AdapterView(ListView就是一个典型的AdapterView,后面还会学习其他的)的桥梁,通过它能有效地实现数据与AdapterView的分离设置,使AdapterView与数据的绑定更加简便,修改更加方便. 常见的有ArrayAdapter<T>用来绑定一个数组,支持泛型操作,SimpleAdapter用来绑定在xml中定义的控件对应的数据.SimpleCursorAdapter用来绑定游标得到的数据. BaseAdapter自定义一个适配器

首先新建一个item_listview的布局页面

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:orientation="horizontal" >        <ImageView         android:id="@+id/iv_photo"        android:layout_width="40dp"        android:layout_height="40dp"        android:src="@drawable/photo3"        />    <TextView         android:id="@+id/tv_name"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="名字"        android:textSize="22sp"        android:layout_gravity="center_vertical"        /></LinearLayout>

一 ArrryAdapter的使用

java代码:

protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);String[] objects = new String[]{"老王","老赵","呵呵"};ListView lv = (ListView) findViewById(R.id.lv);//lv.setAdapter(new ArrayAdapter<String>(this, R.layout.item_listview, R.id.tv_name, objects));


二SimpleAdapter的使用

java代码:

protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);ListView lv = (ListView) findViewById(R.id.lv);//集合中每个元素都包含ListView条目需要的所有数据,该案例中每个条目需要一个字符串和一个整型,所以使用一个map来封装这两种数据List<Map<String, Object>> data = new ArrayList<Map<String,Object>>();Map<String, Object> map1 = new HashMap<String, Object>();map1.put("photo", R.drawable.photo1);map1.put("name", "小志的儿子");data.add(map1);Map<String, Object> map2 = new HashMap<String, Object>();map2.put("photo", R.drawable.photo2);map2.put("name", "小志");data.add(map2);Map<String, Object> map3 = new HashMap<String, Object>();map3.put("photo", R.drawable.photo3);map3.put("name", "赵帅哥");data.add(map3);lv.setAdapter(new SimpleAdapter(this, data, R.layout.item_listview, new String[]{"photo", "name"}, new int[]{R.id.iv_photo, R.id.tv_name}));}

三 BaseAdapter的使用

* 必须实现的两个方法
* 第一个
//系统调用此方法,用来获知模型层有多少条数据
@Override
public int getCount() {
return people.size();
}

* 第二个


//系统调用此方法,获取要显示至ListView的View对象
//position:是return的View对象所对应的数据在集合中的位置
// 第一次调用就是0 ,第二次就是1 第三次就是2
@Override
public View getView(int position, View convertView, ViewGroup parent) {
System.out.println("getView方法调用" + position);
TextView tv = new TextView(MainActivity.this);
//拿到集合中的元素
Person p = peoplelist.get(position);
tv.setText(p.toString());

//把TextView的对象返回出去,它会变成ListView的条目
return tv;
}
* 屏幕上能显示多少个条目,getView方法就会被调用多少次,屏幕向下滑动时,getView会继续被调用,创建更多的View对象显示至屏幕
* 当条目划出屏幕时,系统会把该条目缓存至内存,当该条目再次进入屏幕,系统在重新调用getView时会把缓存的条目作为convertView参数传入,
但是传入的条目不一定是之前被缓存的该条目,即系统有可能在调用getView方法获取第一个条目时,
传入任意一个条目的缓存

示例:

 class MyAdapter extends BaseAdapter{    //系统调用,用来获知集合中有多少条元素@Overridepublic int getCount() {return personList.size();}//由系统调用,获取一个View对象,作为ListView的条目//position:本次getView方法调用所返回的View对象,在listView中是处于第几个条目,那么position的值就是多少@Overridepublic View getView(int position, View convertView, ViewGroup parent) {Person p = personList.get(position);//TextView tv = new TextView(MainActivity.this);System.out.println("getView调用:" + position + ";" + convertView);//tv.setText(p.toString());//tv.setTextSize(18);View v = null;//判断条目是否有缓存if(convertView == null){//把布局文件填充成一个View对象v = View.inflate(MainActivity.this, R.layout.item_listview, null);}else{v = convertView;}//获取布局填充器对象//LayoutInflater inflater = LayoutInflater.from(MainActivity.this);//使用布局填充器填充布局文件//View v2 = inflater.inflate(R.layout.item_listview, null);//LayoutInflater inflater2 = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);//View v3 = inflater2.inflate(R.layout.item_listview, null);//通过资源id查找组件,注意调用的是View对象的findViewByIdTextView tv_name = (TextView) v.findViewById(R.id.tv_name);tv_name.setText(p.getName());TextView tv_phone = (TextView) v.findViewById(R.id.tv_phone);tv_phone.setText(p.getPhone());TextView tv_salary = (TextView) v.findViewById(R.id.tv_salary);tv_salary.setText(p.getSalary());return v;}@Overridepublic Object getItem(int position) {return null;}@Overridepublic long getItemId(int position) {return 0;}        }