?ListView简介
在 Android 系统的很多应用中,我们会经常看到列表。
而且列表的样式各种各样,这是怎么实现的呢?
答案是通过 ListView 实现的。
ListView 的直接父类是 View.Group,也就是说,他自己定义了子排列 View 的规则。
ListView 和所要展示的内容(数据源)之间需要 Adapter(适配器) 来实现。
Adapter 是一个桥梁,对 ListView 的数据进行管理。
数据来源不同,所使用的 Adapter 也不同,数据源(Data source)、Adapter和列表(ListView)之间的关系如下图所示:
而生成列表视图的方式主要有两种:
- 直接用ListView进行创建
- 让Activity继承ListActivity
而一旦获取到 ListView 后,对数据的填充就是由 Adapter 提供内容了,通常使用 setAdapter() 方法。
?ListView相关属性
- android:dividerHeight="2dp" : 设置分割线高度
- android:divider="#3CA9C4" : 设置分隔线颜色
?Adapter简介
Adapter 是一个接口。
ListAdapter 继承了 Adapter,也是一个接口,并需要子类实现。
BaseAdapter 实现了 ListAdapter,他是一个抽象类。
SimpleAdapter 继承自 BaseAdapter,他是 Adapter 的一个实例对象。
另外,还有 ArrayAdapter 和 SimpleCursorAdapter 也是 Adapter 的实例对象。
Adapter 的继承结关系如下图所示:
- BaseAdapter:抽象类,实际开发中我们会继承这个类并且重写相关方法,用得最多的一个Adapter
- ArrayAdapter:支持泛型操作,最简单的一个Adapter,只能展现一行文字
- SimpleAdapter:同样具有良好扩展性的一个Adapter,可以自定义多种效果
- SimpleCursorAdapter:用于显示简单文本类型的listView,一般在数据库那里会用到,不过有点过时, 不推荐使用
ArrayAdapter
?案例一
在 res/layout 新建 activity_array_adapter.xml 文件,添加代码如下:
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:orientation="vertical" 6 android:padding="10dp"> 7 8 <TextView 9 android:layout_width="match_parent" 10 android:layout_height="wrap_content" 11 android:text="测试ArrayAdapter" 12 android:textSize="20sp"/> 13 <ListView 14 android:id="@+id/lv_array_adapter" 15 android:layout_width="match_parent" 16 android:layout_height="wrap_content" 17 android:divider="#3CA9C4" 18 android:dividerHeight="2dp" 19 android:headerDividersEnabled="false" 20 /> 21 22 </LinearLayout>ListView 设置了分割线为蓝色。
新建 ArrayAdapterActivity.java 代码,添加代码如下:
1 public class ArrayAdapterActivity extends AppCompatActivity { 2 3 private ListView lv1; 4 @Override 5 protected void onCreate(@Nullable Bundle savedInstanceState) { 6 super.onCreate(savedInstanceState); 7 setContentView(R.layout.activity_array_adapter); 8 9 lv1 = findViewById(R.id.lv_array_adapter); 10 String[] s = new String[]{"明楼","明台","明诚","明镜"}; 11 ArrayAdapter<String> adapter = new ArrayAdapter<>(this,R.layout.array_item,s); 12 lv1.setAdapter(adapter); 13 } 14 }其中定义了一个字符串数组 s ,通过 ArrayAdapter 进行包装作为listView的数据源。
R.layout.array_item 则是数据项的布局,用来设置显示的字体(明楼、明台、明诚、明镜)风格,代码如下:
1 <?xml version="1.0" encoding="utf-8"?> 2 <TextView xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:id="@+id/textView" 6 android:textSize="20sp" 7 android:padding="10dp"> 8 9 </TextView>?运行效果
?案例二
除了通过直接用ListView进行创建外,还可以通过让 Activity 继承 ListActivity 来实现。
将 ArrayAdapterActivity.java 代码改成如下内容:
1 public class ArrayAdapterActivity extends ListActivity { 2 3 private ListView lv1; 4 @Override 5 protected void onCreate(@Nullable Bundle savedInstanceState) { 6 super.onCreate(savedInstanceState); 7 8 String[] s = new String[]{"明楼","明台","明诚","明镜"}; 9 ArrayAdapter<String> adapter = new ArrayAdapter<>(this,R.layout.array_item,s); 10 11 setListAdapter(adapter); 12 } 13 }
?运行效果