Adapter 只是一个接口,其派生了ListAdapter和SpinnerAdater两个子接口。
ListAdater为AbsListView提供列表项,SpinnerAdater为AbsSpinner提供列表项。
以下是Adapter相关类的关系图
Adapter常用的实现类:
- ArrayAdapter: 通常用于将数组或者List集合的多个值包装成多个列表项。
- SimpleAdapter: 用于将List集合的多个对象包装成多个列表项。
- SimpleCursorAdapter: 与SimpleAdapter基本相似,只是用于包装Cursor提供的数据。
- BaseAdapter: 通常用于被扩展。扩展BaseAdapter可以对各列表项进行最大限度地定制。
使用ArrayAdapter创建ListView
修改activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/list1"
android:divider="#f00"
android:dividerHeight="2px"
android:headerDividersEnabled="false"></ListView>
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/list2"
android:divider="#0f0"
android:dividerHeight="2px"
android:headerDividersEnabled="false"></ListView>
</LinearLayout>
android:divider:
可以实现分割线,可以用图片或者颜色
android:dividerHeight
设置分割线的高度
android:headerDividersEnabled
是否显示头部的分割线,默认是true
修改MainActivity.java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView list1 = (ListView) findViewById(R.id.list1);
String [] arr1 = {"孙悟空","猪八戒","牛魔王"};
ArrayAdapter<String> adapter1 = new ArrayAdapter<String>(this,R.layout.array_item,arr1);
list1.setAdapter(adapter1);
ListView list2 = (ListView) findViewById(R.id.list2);
String[] arr2 = { "java","hibernate","spring","android"};
ArrayAdapter<String> adapter2 = new ArrayAdapter<String>(this,R.layout.checked_item,arr2);
list2.setAdapter(adapter2);
}
}
ArrayAdapter<String> adapter1 = new ArrayAdapter<String>(this,R.layout.array_item,arr1);
ArrayAdapter传入了三个参数:
Context: 代表了访问整个Android应用的接口。
textViewResourceId: 一个TextView的资源ID,该TextView组件将作为ArrayAdapter的列表项组件。
数组或者List: 提供数据。
以上代码可以看到,该数组或List包含多少个元素,就将会生成多少个列表项,每个列表项都是TextView组件。
arr1有三个数据,则会生成一个包含三个列表项的ArrayAdapter,每个列表项的组件外观由R.layout.array_item布局文件(该布局文件只是一个TextView)控制。
新建array_item.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/TextView"
android:textSize="24dp"
android:padding="10px"
android:shadowColor="#f0f"
android:shadowDx="4"
android:shadowDy="4"
android:shadowRadius="2"/>
TextView-shadow 阴影实现方式
android:shadowColor:阴影的颜色
android:shadowDx:水平方向上的偏移量
android:shadowDy:垂直方向上的偏移量
android:shadowRadius:是阴影的的半径大小,值也大,阴影越大
新建 checked_item.xml
<?xml version="1.0" encoding="utf-8"?>
<CheckedTextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/checktextview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="24dp"
android:padding="10px"
android:checked="true"
android:checkMark="?android:listChoiceIndicatorMultiple"
/>
运行结果:
基于ListActivity实现列表
如果程序仅仅只是显示一个列表,那么可以无需通过设置xml来实现,而是直接让Activity继承ListActivity来实现。
修改MainActivity.java
public class Main2Activity extends ListActivity {
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
String[] atr = {"孙悟空","猪八戒","牛魔王"};
ArrayAdapter <String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_multiple_choice,atr);
setListAdapter(adapter);
}
}
可以看到,不用使用setContentView()去调用布局文件。
运行结果: