什么是适配器?
下图展示了数据源、适配器、ListView等数据展示控件之间的关系。我们知道,数据源是各种各样的,而ListView所展示数据的格式则是有一定的要求的。数据适配器正是建立了数据源与ListView之间的适配关系,将数据源转换为ListView能够显示的数据格式,从而将数据的来源与数据的显示进行解耦,降低程序的耦合性。这也体现了Android的适配器模式的使用。对于ListView、GridView等数据展示控件有多种数据适配器,本文讲解最通用的数据适配器——BaseAdapter。
使用方法
1.在布局文件中引用ListView
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="wrap_content"></ListView>
</RelativeLayout>
2.编写ListView布局,这里为了避免复杂只使用了一个TextView
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/text"
android:gravity="center"
android:textSize="17dp"
android:textColor="#000"
android:paddingVertical="5dp"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
3.Activity中的代码
public class MainActivity extends AppCompatActivity {
private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView=findViewById(R.id.listView);
//将数组中的数据绑定到listView
final String[] strings=new String[]{"张三","李四","王五"};
/*BaseAdapter适配器至少要实现getCount和getView方法
getCount决定了list的数目,getView决定了每个视图
*/
listView.setAdapter(new BaseAdapter() {
@Override
public int getCount() {
return strings.length;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//创建一个视图
convertView=View.inflate(MainActivity.this,R.layout.item,null);
//设置数据
TextView textView=convertView.findViewById(R.id.text);
textView.setText(strings[position]);
//最后将视图返回
return convertView;
}
});
}
}
最后我们来看看效果吧