首先先将我们之前的ArrayAdapter和SimpleAdapter总结一下。
ArrayAdapter适用在只是TextView呈现字符串的适配上,SimpleAdapter可以适配多控件。
在数据源方面:ArrayAdapter的数据源是List<String>
SimpleAdapter的数据源是List<Map<String,Object>>
自定义适配器是我们开发中经常会使用到的适配器对象,它可以将动态变化的数据适配给ListView,并且与ArrayAdapter、SimpleAdapter都继承BaseAdapter,而在自定义适配器中一定需要重写以下四个方法:
int getCount():返回填充的数据项的个数,必须返回真实值。
Object getItem(int position):根据position返回某一项数据。
long getIemId(int position):根据position返回某一行的行ID。
View getView(int position,View convertView,ViewGroup parent):根据position返回某一项的界面View,显示给用户。
下面我们来简单通过代码实现来了解一下自定义适配器。
代码实现:
MainActivity.java
private ListView lv;
private List<String> list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化控件
lv = (ListView) findViewById(R.id.lv);
//初始化数据源
list = new ArrayList<String>();
for (int i = 0; i < 40 ; i++){
list.add("数据" + i);
}
}
//实现自己的适配器
class MyAdapter extends BaseAdapter{
@Override
//计算需要适配的item总数
public int getCount() {
return list.size();
}
@Override
//获取每一个item对象
public String getItem(int position) {
return list.get(position);
}
@Override
//获取每一个item对象的id
public long getItemId(int position) {
return position;
}
@Override
//获取每个item对应的View视图
public View getView(int position, View convertView, ViewGroup parent) {
//获取布局映射器对象
LayoutInflater inflater = LayoutInflater.from(MainActivity.this);
//将定义好的xml文件转化为View对象
View view = inflater.inflate(R.layout.myadapter_item,null);
//给view对象中的控件进行赋值
TextView tv = (TextView) view.findViewById(R.id.myadapter_item);
tv.setText(getItem(position));
return view;
}
}
myadapter_item.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/myadapter_item"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="20sp"
android:padding="8dp"
android:text="你好"/>
</LinearLayout>
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.testmyadapter.MainActivity">
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
在自定义适配器重写的四个方法中,尤为重要的是getView()方法,我们需要在其中实现一系列的转化操作。
且这里牵扯到一个之前的了解的概念:布局映射器。
LayoutInflater:布局映射器
通过from方法获取布局映射器对象,然后就可以通过该对象的inflater方法将一个xml文件转化为View对象。