自定义Adapter | 青训营笔记

242 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第6天

Adapter(适配器)

MVC模式

MVC模式:数据模型(M)-视图(V)-控制器(C)

  • Model:通过view获得用户输入的数据,并从数据库查询相关的信息,运算后将结果交给view显示
  • View:用户操作的接口
  • Controller:model 与 view 之间的枢纽,控制程序的执行流程以及对象之间的互动

简单的实例

使用Adapter往列表中填信息

  1. 编写列表的layout文件
  2. 编写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的继承关系

android_adapter_3.png

常用的几个类

  • 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

  1. 根据需求新建总布局文件 以及 每一部分的布局
  2. 新建用于存放每一部分的数据的类
  3. 新建继承Adapter方法的类
    • 例:public class MyAdapter extends BaseAdapter
    • 泛型:public class MyAdapter<T> extends BaseAdapter
  4. 根据需求重写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;
    }
}

如何使用

  1. new一个List,往里面填数据
  2. 创建一个MyAdapter并往里面传填好数据的List和Content
  3. 创建与总布局文件连接的View
  4. 为这个View设置步骤2中的MyAdapter
  • 例:
    List<Item> list = new LinkedList<>();
    //填入数据
    MyAdapter myAdapter = new MyAdapter(list, getApplicationContext());
    ListView listView  = findViewById(R.id.listview);
    listView.setAdapter(myAdapter);