自定义ListView的Adapter

一、自定义MyAdapter

public class MyAdapter extends BaseAdapter {

    //Adapter的作用相当于是从数据到行布局的映射。这就需要传入需要显示的List数据
    List<Map<String, Object>> list;
    //反射器
    LayoutInflater inflater;


    //初始化反射器
    public MyAdapter(Context context) {
        this.inflater = LayoutInflater.from(context);
    }

    //通过此方法初始化List
    public void setList(List<Map<String, Object>> list) {
        this.list = list;
    }

    //如果返回默认的0,不管你传入什么List,全部都不显示
    //返回list.size();就刚好显示list长度对应的条数。
    @Override
    public int getCount() {
        return list.size();
    }

    //因为使用的是List,这里就是设置了如何从List的下标如何得到List中的数据
    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

    //当前这一项的id是多少?List每一项的id就是下标position
    @Override
    public long getItemId(int position) {
        return position;
    }

    //页面渲染时时一行一行的渲染,从position 0开始。如果这里给他返回空,页面就什么也不显示。
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        //反射器的作用就在这里,把一个xml的文本文件反射为一个View对象。
        //这里是两个参数方法,还有其他参数类型的方法
        //第一个参数就是传入对应的行布局的id
        //第二个参数应该传入父容器.实际使用时,可以不传也能正常运行
        View view = inflater.inflate(R.layout.item, null);

        //findViewById这个方法以前是直接使用的,前面没有加对象名。其实默认的是this.findViewById
        //当前,view已经通过反射成为了此行布局。可以通过它来得到下级的控件
        ImageView logo = view.findViewById(R.id.logo);
        TextView title = view.findViewById(R.id.title);
        TextView version = view.findViewById(R.id.version);
        TextView size = view.findViewById(R.id.size);

        //针对当前position将list的数据传给view
        Map map = list.get(position);
        logo.setImageResource((Integer) map.get("logo"));
        title.setText((String) map.get("title"));
        version.setText((String) map.get("version"));
        size.setText((String) map.get("size"));

        return view;
    }
}

二、在MainActivity中使用

        MyAdapter adapter = new MyAdapter(this);
        adapter.setList(list);
        lv.setAdapter(adapter);

猜你喜欢

转载自www.cnblogs.com/xxie12/p/11484406.html