Android适配器之BaseAdapter

来源:互联网 发布:迪杰斯特拉算法 详解 编辑:程序博客网 时间:2024/06/05 02:59

BaseAdapter是android应用程序中经常用到的基础数据适配器的基类,它实现了Adapter接口。

主要用途是将一组数据传到像ListView、Spinner、Gallery及GridView等UI显示组件进行显示。


在我们需要自定义适配器时(adapter)时我们就需要继承BaseAdapter抽象类,有几个函数是必须要重写的,它们是:

    public abstract int getCount()

    public abstract Object getItem(int position)   

    public abstract long getItemId(int position)

    public abstract View getView(int position, View convertView, ViewGroup parent)


其中getView()是重点需要重写的方法。


     1.getCount()决定了我们将要绘制的资源数,当然这个数目不能大于资源的总数,不过却可以小于资源的总数。例如我们adapter管理的资源总共有10个,而我们通过getCount()返回的只有6个,那么最终GridView绘制出来的将只有6个。


     2.getView():通过传入的参数position,加工成我们想要的View并返回,最终供控件使用


     3.getItemId()该方法的返回值决定第position处的列表项的ID,某些方法(如onclicklistener的onclick方法)有id这个参数,而这个id参数就是取决于getItemId()这个返回值的。


     4.getItem():getItem方法不是在Baseadapter类中被调用的,而是在Adapterview.getItemAtPosition(position) 中被调用的。getItemAtPosition(position) 是在setOnItemClickListener、setOnItemLongClickListener、setOnItemSelectedListener的点击选择处理事件中方便地调用来获取当前行数据的。
 

getItem()和getItemId()有什么用呢?我们知道,GridView将View以方格的方式展示出来之后是要与用户交互的(比如点击某张图片),为了更好的相应用户的动作,我们就要用到这两个函数了。



下面是本人自己写的一个自定义适配器:


 //自定义适配器    class MyAdapter extends BaseAdapter {        //得到所有元素数量        @Override        public int getCount() {            return li.size();        }        //根据下标得到单个元素        @Override        public Object getItem(int position) {            return li.get(position);        }        //得到单个元素的ID        @Override        public long getItemId(int position) {            return position;        }//        (重点)对控件进行不同布局的配置以及其中元素的配置        @Override        public View getView(int position, View convertView, ViewGroup parent) {            //设置不同的布局(大分类与小分类的布局不同)            if (group.contains(li.get(position))){                convertView = LayoutInflater.from(getApplicationContext()).inflate(R.layout.lvg_group_view , null);            }else{                convertView = LayoutInflater.from(getApplicationContext()).inflate(R.layout.lvg_child_view , null);            }            //设置文字            TextView text = (TextView) convertView.findViewById(R.id.parent_title);            text.setText(li.get(position));            return convertView;        }    }



其中,lvg_group_view和lvg_child_view是本人自行写的两个layout文件,为大分类和小分类配置不同的布局和样式

两个文件中都有同一个TextView,id是一样的(当然也可以不一样,代码就需要放到上面的判断中去执行)


分享使人进步!






原创粉丝点击