Android知识点 - ListView的使用

ListView的使用

一、简单使用

使用步骤

1、 布局文件添加ListView控件

<ListView
        android:id="@+id/v_city_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </ListView>

2、在对应的Activity里,将数据源准备好,可从网上下载或者从数据库中读取,利用适配器将数据传递给ListView,一般用ArrayAdapter。

//数据源
private String[] data = {"aaa", "bbb", "ccc"};
//参数(当前context, 子项布局id, 数据源),android.R.layout.simple_list_item_1为android内置的布局文件
ArrayAdapter<String> adapter = new ArrayAdapter<String>(
	MainActivity.this, android.R.layout.simple_list_item_1, data);
ListView listView = findViewById(R.id.v_city_list);
//最后调用setAdapter()
listView.setAdapter(adapter);

二、稍复杂的自定义ListView界面

使用步骤

  1. 定义一个实体类,作为ListView适配器的适配类型
  2. 自定义一个布局文件作为子项的布局
  3. 自定义适配器,继承ArrayAdapter<泛型为刚定义的实体类>
    1. 重写ArrayAdapter的一组构造函数,参数(当前context, 子项布局id, 数据源)
    2. 重写getVIew()方法,子项被滚动进屏幕时会被调用。
      1. 获取当前项City实例
      2. convertView参数用于将之前加载好的布局缓存,之后重用
      3. convertView为null时加载子项
        1. 结合ViewHolder对控件实例进行缓存,提高运行效率,可先看下面的 3)
        2. 将viewHolder存储在view中,view.setTag(viewHolder)
      4. 不为null时,从convertView中取出已经保存到控件实例的viewHolder,这样就避免了控件的重复实例,提高效率
      5. 控件设置操作
      6. 返回view
    3. 新建一个ViewHolder类保存子项控件的实例,提高效率。
  4. 在Activity里设置数据源,用刚重写的构造方法创建适配器实例,并用ListView实例调用setAdapter(适配器实例)即可。另外添加子项的点击监听器
    1. add一些自定义类的数据
    2. 用ListView实例调用setAdapter(适配器实例)
    3. 添加子项的点击监听器
      1. 通过position参数判断出用户点击哪个子项,然后获取相应的自定义类实例

案例

1、定义一个实体类,作为ListView适配器的适配类型

//文件:BasicBean.java

class BasicBean {
    /**
     * cid : CN101281002
     * location : 吴川
     * parent_city : 湛江
     * admin_area : 广东
     */
    private String cid;
    private String location;
    private String parent_city;
    private String admin_area;

    public String getCid() {
        return cid;
    }
    public String getLocation() {
        return location;
    }
    public String getParent_city() {
        return parent_city;
    }
    public String getAdmin_area() {
        return admin_area;
    }
}

2、自定义一个布局文件作为子项的布局

//文件:R.layout.city_list_item.xml
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" 
    android:layout_height="match_parent">
    <TextView
        android:id="@+id/city_name"
        android:layout_marginTop="20dp"
        android:layout_alignParentLeft="true"
        android:layout_marginLeft="10dp"
        android:layout_centerVertical="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"/>
    <TextView
        android:id="@+id/parent_city"
        android:layout_alignParentRight="true"
        android:layout_marginRight="10dp"
        android:layout_centerVertical="true"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"/>
    <TextView
        android:id="@+id/admin_area"
        android:layout_centerVertical="true"
        android:layout_toLeftOf="@id/parent_city"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"/>
</RelativeLayout>

3、自定义适配器,继承ArrayAdapter<泛型为刚定义的实体类>

//文件:CityAdater.java
//继承ArrayAdapter<泛型为刚定义的实体类>
public class CityAdater extends ArrayAdapter<BasicBean> {
	//布局文件id
    private int resourceId;

	// 1)重写ArrayAdapter的一组构造函数,参数(当前context, 子项布局id, 数据源)
    public CityAdater(Context context, int resource, List<BasicBean> objects) {
        super(context, resource, objects);
        this.resourceId = resource;
    }
	// 2)重写getVIew()方法,子项被滚动进屏幕时会被调用。
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // 2-1) 获取当前项City实例
       BasicBean city = getItem(position);
        
        // 2-2) convertView参数用于将之前加载好的布局缓存,之后重用
        View view;
        ViewHolder viewHolder;
        if (convertView == null) {
        	// 2-3) 为null时加载子项
            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.city_list_item, parent, false);
              // 2-3-1) 结合ViewHolder对控件实例进行缓存,提高运行效率,可先看下面的 3)
            viewHolder = new ViewHolder();
            viewHolder.cityName = view.findViewById(R.id.city_name);
            viewHolder.parentCity = view.findViewById(R.id.parent_city);
            viewHolder.adminArea = view.findViewById(R.id.admin_area);
            // 2-3-2) 将viewHolder存储在view中
            view.setTag(viewHolder);
        } else {
        	// 2-4) 不为null时,从convertView中取出已经保存到控件实例的viewHolder,
        	//这样就避免了控件的重复实例,提高效率
            view = convertView;
            viewHolder = (ViewHolder) view.getTag();
        }
		// 2-5) 控件设置操作
        viewHolder.cityName.setText(city.getLocation());
        viewHolder.parentCity.setText(city.getParent_city());
        viewHolder.adminArea.setText(city.getAdmin_area() + ",");
		// 2-6) 返回view
        return view;
    }
	// 3) 新建ViewHolder类保存控件的实例
    class ViewHolder {
        TextView cityName;
        TextView parentCity;
        TextView adminArea;
    }
}

4、在Activity里设置数据源,用刚重写的构造方法创建适配器实例,并用ListView实例调用setAdapter(适配器实例)即可。另外添加子项的点击监听器。

//文件:SearchCity.java
//只写出关键代码 
ListView cityListV = findViewById(R.id.v_city_list);
List<BasicBean> cities = new ArrayList<>();
// 4-1) add一些自定义类的数据
cities.add(new BasicBean(xxx参数xxx));
// 4-2) 用ListView实例调用setAdapter(适配器实例)
CityAdater cityAdater = new CityAdater(SearchCity.this, R.layout.city_list_item, cities);
cityListV.setAdapter(cityAdater);
// 4-3) 添加子项的点击监听器
cityListV.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            	// 4-3-1) 通过position参数判断出用户点击哪个子项,然后获取相应的自定义类实例
                BasicBean city = cities.get(position);
                String cid = city.getCid();
                //自定义操作
            }
        });

效果

在这里插入图片描述

附上郭神ListView系列三部曲

  1. https://blog.csdn.net/guolin_blog/article/details/44996879
  2. https://blog.csdn.net/guolin_blog/article/details/45586553
  3. https://blog.csdn.net/guolin_blog/article/details/46361889

猜你喜欢

转载自blog.csdn.net/weixin_44565784/article/details/100023739
今日推荐