BaseAdapter用法(一)

来源:互联网 发布:arduino摄像头编程 编辑:程序博客网 时间:2024/05/20 04:32

在第一行代码中学习到ListView的用法时,ListView写的这堆代码有很多不明白的地方,所以找到了慕课网BaseAdapter的优化这节课(链接:慕课网BaseAdapter的优化)对比来学习:由于Arrayadapter是从BaseAdapter派生出来的,具备BaseAdapter的所有功能,但ArrayAdapter更强大一些。所以先学习BaseAdapter的用法:

1.activity_main.xml布局文件中加入ListView控件,并设置属性; 创建一个fruit_item.xml文件,加入一个TextView和ImageView控件,并设置相应属性;2. 首先创建一个Bean类(视频中好像是ItemBean),这没什么可说的:代码如下:Bean.java
public class Bean {    private int ItemImage;    private String ItemTitle;    public Bean(int itemImage, String itemTitle) {        this.ItemImage = itemImage;        this.ItemTitle = itemTitle;    }    public int getItemImage() {        return ItemImage;    }    public String getItemTitle() {        return ItemTitle;    }}
3. 创建数据源:MainActivity.java部分代码:
List<Bean>fruit_list=new ArrayList<Bean>();for (int i = 0; i < 20; i++) {    fruit_list.add(new Bean(R.drawable.ic_launcher, "标题"+i));}
4. 创建适配器:MyAdapter.java代码<1>. 创建MyAdapter继承BaseAdapter,并重写方法源码:
    List<Bean>mlist=new ArrayList<Bean>();    LayoutInflater mInflater;    public MyAdapter(Context context,List<Bean>list) {        this.mlist=list;        mInflater=LayoutInflater.from(context);        <!--from(context):Obtains the LayoutInflater from the given context.         LayoutInflater:Instantiates a layout XML file into its corresponding View objects.-->    }    @Override    public int getCount() {        //适配器中数据集中数据的个数(此时数据集就是mlist)        return mlist.size() ;    }    @Override    public Object getItem(int position) {        // 获取数据集中与指定索引对应的数据项        return mlist.get(position);    }    @Override    public long getItemId(int position) {        //获取指定行对应的ID        return position;    }
<2>. 关于getView方法的重写:
@Override    public View getView(int position, View convertView, ViewGroup parent) {        //将我们需要的布局样式(fruit_item)转化成view对象        //关于LayoutInflater官方文档解释如下:Instantiates a layout XML file into its corresponding  View objects        View view=mInflater.inflate(R.layout.fruit_item, null);        ImageView image_view=(ImageView) view.findViewById(R.id.fruit_image);        TextView tv_name=(TextView) view.findViewById(R.id.fruit_name);        Bean  Itembean=mlist.get(position);        //mlist是一个数据集,而get(position)得到的才是mlist中的元素(即一个Bean对象),这样才能调用Bean对象中的getItemImage()、getItemTitle()方法来给控件设置对应的值。        image_view.setImageResource(Itembean.getItemImage());        tv_name.setText(Itembean.getItemTitle());        return view;    }
5.将适配器与数据连接起来:
        ListView list_view=(ListView) findViewById(R.id.list_view);        MyAdapter myadapter=new MyAdapter(MainActivity.this, fruit_list);        list_view.setAdapter(myadapter);

关于ListView的工作机制:

listView在开始绘制的时候,系统首先调用getCount()函数,根据他的返回值得到listView的长度(这也是为什么在开始的第一张图特别的标出列表长度),然后根据这个长度,调用getView()逐一绘制每一行。如果你的getCount()返回值是0的话,列表将不显示同样return 1,就只显示一行。

系统显示列表时,首先实例化一个适配器(这里将实例化自定义的适配器)。当手动完成适配时,必须手动映射数据,这需要重写getView()方法。系统在绘制列表的每一行的时候将调用此方法。getView()有三个参数,position表示将显示的是第几行,covertView是从布局文件中inflate来的布局。我们用LayoutInflater的方法将定义好的vlist2.xml文件提取成View实例用来显示。然后将xml文件中的各个组件实例化(简单的findViewById()方法)。这样便可以将数据对应到各个组件上了。但是按钮为了响应点击事件,需要为它添加点击监听器,这样就能捕获点击事件。至此一个自定义的listView就完成了,现在让我们回过头从新审视这个过程。系统要绘制ListView了,他首先获得要绘制的这个列表的长度,然后开始绘制第一行,怎么绘制呢?调用getView()函数。在这个函数里面首先获得一个View(实际上是一个ViewGroup),然后再实例并设置各个组件,显示之。好了,绘制完这一行了。那再绘制下一行,直到绘完为止。在实际的运行过程中会发现listView的每一行没有焦点了,这是因为Button抢夺了listView的焦点,只要布局文件中将Button设置为没有焦点就OK了。

参考链接:http://www.cnblogs.com/devinzhang/archive/2012/01/20/2328334.html

0 0
原创粉丝点击