这是我参与「第四届青训营 」笔记创作活动的第6天
Adapter(适配器)
MVC模式
MVC模式:数据模型(M)-视图(V)-控制器(C)
- Model:通过view获得用户输入的数据,并从数据库查询相关的信息,运算后将结果交给view显示
- View:用户操作的接口
- Controller:model 与 view 之间的枢纽,控制程序的执行流程以及对象之间的互动
简单的实例
使用Adapter往列表中填信息
- 编写列表的layout文件
- 编写Activity文件
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//获取/定义 内容
String[] contents = {"aaa","bbb","ccc","dddd"};
//实例化适配器
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<>(this, android.R.layout.simple_expandable_list_item_1);
//将内容填入适配器
for(String content : contents){
arrayAdapter.add(content);
}
//为对象设置适配器
ListView listView = findViewById(R.id.listview);
listView.setAdapter(arrayAdapter);
}
自定义Adapter
Adapter的继承关系
常用的几个类
- BaseAdapter 抽象类
- ArrayAdapter 支持泛型操作,最简单的 Adapter,只能展现一行文字
- SimpleAdapter 可以自定义多种效果
公共方法
(来自:android.google.cn)
- int getCount():表示的数据集中有多少个项目
- Object getItem(int position):获取与数据集中的指定位置关联的数据项
- long getItemId(int position):获取与列表中指定位置关联的行 ID
- int getItemViewType(int position):获取将由 getView(int, View, ViewGroup)指定项目创建的视图类型
- View getView(int position, View convertView, ViewGroup parent):获取一个视图,该视图显示数据集中指定位置的数据
- int getViewTypeCount():返回将由创建的视图类型数。getView(int, View, ViewGroup)
- void registerDataSetObserver(DataSetObserver observer):注册一个观察者,当此适配器使用的数据发生更改时调用该观察器。
- void unregisterDataSetObserver(DataSetObserver observer):注销以前已通过此适配器注册的观察者。registerDataSetObserver(DataSetObserver)
创建自定义的Adapter
- 根据需求新建总布局文件 以及 每一部分的布局
- 新建用于存放每一部分的数据的类
- 新建继承Adapter方法的类
- 例:
public class MyAdapter extends BaseAdapter - 泛型:
public class MyAdapter<T> extends BaseAdapter
- 例:
- 根据需求重写MyAdapter的方法或写新方法
-
例:
public class MyAdapter extends BaseAdapter {
private List<Item> dataList;
private Context context;
public MyAdapter(List<Item> dataList, Context context) {
this.dataList = dataList;
this.context = context;
}
@Override
public int getCount() {
return dataList.size();
}
@Override
public Object getItem(int i) {
return dataList.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@SuppressLint("ViewHolder")
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
view = LayoutInflater.from(context).inflate(R.layout.item, viewGroup, false);
ImageView imageView = view.findViewById(R.id.image);
TextView textView = view.findViewById(R.id.text);
imageView.setBackgroundResource(this.dataList.get(i).getIcon());
textView.setText(this.dataList.get(i).getString());
return view;
}
}
如何使用
- new一个List,往里面填数据
- 创建一个MyAdapter并往里面传填好数据的List和Content
- 创建与总布局文件连接的View
- 为这个View设置步骤2中的MyAdapter
-
例:
List<Item> list = new LinkedList<>();
//填入数据
MyAdapter myAdapter = new MyAdapter(list, getApplicationContext());
ListView listView = findViewById(R.id.listview);
listView.setAdapter(myAdapter);