Skip to content

高级控件

ListView

需要导入的包:android.widget.ListView

ListView主要是以列表的形式展示具体内容,并能够根据数据的长度自适应显示,如果列表项过多还可以自动实现滚动。

常用属性

  • android:entries:数据源,应是array资源
  • android:divider:分割线样式,可以是drawable或color资源
  • android:dividerHeight:分割线高度

系统自带ListView布局

  • android.R.layout.simple_list_item_1:列表选项为单独一行的文本框
  • android.R.layout.simple_list_item_2:列表选项包含上下两个文本框
  • android.R.layout.simple_list_item_checked:每项都是一个已选中的列表选项
  • android.R.layout.simple_list_item_single_choice:列表选项包含一个单选按钮
  • android.R.layout.simple_list_item_multiple_choice:列表选项包含一个复选框

布局模式

通过 setChoiceMode() 进行设置。如果采用无选择模式,可不使用该方法,因为这是系统默认采用的模式。
- ListView.CHOICE_MODE_NONE:无选择模式(默认)
- ListView.CHOICE_MODE_SINGLE:最多可以有一项被选中
- ListView.CHOICE_MODE_MULTIPLE:可以多项被选中

通过资源进行数据绑定 (在布局文件中绑定数据源)

通过数据绑定,以实现用一个组件绑定多组信息。

  1. 定义数组资源
    res/values/arrays.xml 中创建数组资源:
    ```xml

    数据项1
    数据项2
    ……

  2. 在布局中绑定数据源

    1
    2
    3
    <ListView
          ……
          android:entries="@array/name" />
    

使用 ArrayAdapter 进行数据绑定

  1. 创建数据源数组 允许使用常量字符串数组或从资源文件 arrays.xml 中获取数据创建信息。

    Java

    String[] arrayname = getResources().getStringArray(R.array.resname);
    
  2. 创建 ArrayAdapter 对象

    Java

    ArrayAdapter<type> adapter = new ArrayAdapter<type>(this, ListView的显示样式, arrayname);
    
  3. 选择布局模式

    listview.setChoiceMode(mode);
    
  4. 适配器绑定到控件上

    listview.setAdapter(adapter);
    

多行文本列表

  1. 创建数据源集合和数据源列表,分别存储单个列表项和多个列表项总和。 key 为 String,Value 为 Object (任意类型)。 map 中的每个元素代表该列表项中的一行,多个 map 中保持格式一致性,即键值对数量相同、键名相同。

    1
    2
    3
    4
    ArrayList<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
    Map<String,Object> map1 = new HashMap<String,Object>();
    map1.put("键名1", 键值1);
    list.add(map1);
    
  2. 创建 SimpleAdapter 对象

    1
    2
    3
    4
    5
    6
    7
    SimpleAdapter adapter = new SimpleAdapter(
        this,
        list, // 数据源集合
        ListView的显示样式布局, // 如 android.R.layout.simple_list_item_2
        new String[]{"键名1", "键名2"}, // item的键名列表
        new int[]{android.R.id.text1, android.R.id.text2} // 显示样式布局中的控件id
    );
    
  3. 绑定适配器

    listview.setAdapter(adapter);
    

自定义样式列表

  1. 新建一个布局文件,为 ListView 选项设计显示样式。

  2. 创建数据源集合和列表,同多行文本列表。

  3. 创建 SimpleAdapter 对象。

    1
    2
    3
    4
    5
    6
    7
    SimpleAdapter adapter = new SimpleAdapter(
        this,
        list,
        R.layout.自定义listView显示样式布局,
        new String[]{"键名1", "键名2"},
        new int[]{R.id.控件id1, R.id.控件id2} // 对应自定义样式布局中的控件id
    );
    
  4. 将适配器绑定到 ListView。

ListView 事件处理

通过设置监听器 AdapterView.OnItemClickListener 来实现对特定选项的监听。

方法:

1
2
3
public void onItemClick(AdapterView<?> parent, View view, int position, long id){    
    // 控件选项选中点击后的事件处理
}
  • parent:容纳适配器的控件对象,如 ListView 对象
  • view:选中选项的 View 对象
  • position:选中记录在数据源中的位置编号
  • id:选项记录行编号,通常和 position 相同

Grid View

需要包:android.weidget.GirdView

以二维可滚动网格展示。

  • columnWidth:列宽
  • horizontalSpacing:列与列之间的水平间距
  • verticalSpacing:行与行之间的 垂直间距
  • numColumns:列数,可设置为整数或auto_fit(默认2列,若设置了列宽则为屏幕宽度/列宽
  • StretchMode:设置拉伸模式
    • none:不拉伸
    • spacingWidth:拉伸列间的间距
    • columnWidth:拉伸列自身
    • spacingWidthUniform:均匀地扩展列和列之间的空间

绑定资源、设置适配器、自定义样式和事件监听与ListView相同。

Recycler View

RecyclerView是ListView和GridView的增强版,支持横向和纵向滑动列表显示,也支持多列网格和瀑布流式布局。

使用RecyclerView控件需要创建自定义Adapter类和LayoutManager类对象(通常直接实例化内置的LayoutManager类即可,无需自行新建自定义的LayoutManager类)。

使用前需要在build.gradle(app)dependencies闭包中添加:

XML

 implementation 'androidx.recyclerview:recyclerview:1.1.0' // 版本号为 1.1.0 或 1.0.0 均可

自定义适配器类

继承RecyclerView.Adapter<自定义内部类名>,必须定义一个继承于RecyclerView.ViewHolder的内部类和重写三个方法:

  • 构造函数,初始化数据源集合。
  • 继承RecyclerView.ViewHolder的自定义内部类:其构造函数接收一个 View 参数(通常是子项布局的最外层控件),并在此使用 findViewById 获取并初始化各个子控件对象。
  • onCreateViewHolder:根据子项样式布局文件创建自定义ViewHolder类实例。通常在此处使用 LayoutInflater.from(parent.getContext()).inflate(...) 方法引入子项布局。
  • onBindViewHolder:每个子项被滚动到屏幕中时,把数据源中第x号的元素各组键值放进子项各个子控件中。
  • getItemCount:返回子项数量(即数据源集合的长度)。

RecyclerView对象

在Activity中的基本配置步骤包括:获取RecyclerView对象、为其设置LayoutManager布局管理器、为其设置自定义适配器对象。

支持三种内置布局:

  • LinearLayoutManager:线性布局的滑动列表,支持横向和纵向滑动。
  • GridLayoutManager:网格布局,需要指定列数(spanCount)。
  • StaggeredGridLayoutManager:瀑布流式布局,需要指定列数和滚动方向。

事件处理

RecyclerView没有像ListView那样提供内置的 setOnItemClickListener 监听器,需监听其选项或选项的子控件,按以下两步实现:

  • 获取事件源控件:可以在自定义适配器类的内部类的构造函数中,或者在 onBindViewHolder 方法中获取事件源控件。
  • 为事件源注册监听器对象:在 onBindViewHolder 方法中,或者在自定义适配器类的内部类的构造函数中为事件源注册监听器对象,定义和重写匿名监听器类。