Android最常用而又最难用控件—ListView(三)。

来源:互联网 发布:java inputstream 编辑:程序博客网 时间:2024/05/29 02:39

使用BaseAdapter必须写一个类继承它,同时BaseAdapter是一个抽象类,继承它必须实现它的方法。BaseAdapter的灵活性就在于它要重写很多方法。
1.getCount()–>要绑定的条目的数目,比如格子的数量
2.getItem()–>根据一个索引(位置)获得该位置的对象
3.getItemId() –>获取条目的id
4.getView(final int position, View convertView, ViewGroup parent)–>获取该条目要显示的界面

  • 注:
    当系统开始绘制ListView的时候,首先调用getCount()方法。得到它的返回值,即ListView的长度。然后系统调用getView()方法,根据这个长度绘制ListView的每一行。
    adapter先从getCount里确定数量,然后循环执行getView方法将条目一个一个绘制出来,所以必须重写的是getCount和getView方法。而getItem和getItemId是调用某些函数才会触发的方法,如果不需要使用可以暂时不修改。

这里我就直接贴代码和步骤:

1.自定义一个adapter,继承BaseAdapter,并重写其中的4个方法
注意:

  • ListView控件的使用发现还有很多细节可以优化,其中目前的运行效率是很低。当ListView快速滚动的时候,适配器中的一个getView()方法会将要显示的布局重新加载一次。为了提高这个效率,需要重写适配器类中的getView()方法。
    ListView控件的使用发现还有很多细节可以优化,例如假如在getView()方法中调用view中的findViewById(0方法来获取一次控件的实例。这种情况需要借助一个ViewHolder来对这部分性能进行优化。
    具体代码如下:
public class MyAdapter extends BaseAdapter {    private String[] colorsName;    private Context context;    private int[] imageId;    //利用构造传递数据    public MyAdapter(String[] colorsName, Context mcontext, int[] imageId) {        this.colorsName = colorsName;        this.context = mcontext;        this.imageId = imageId;    }    //绑定列表的子项目数    @Override    public int getCount() {        return colorsName.length;    }    //根据索引(位置)获取该位置对象    @Override    public Object getItem(int position) {        return null;    }    //获取子项的id    @Override    public long getItemId(int position) {        return 0;    }    //获取子项要显示的界面    @Override    public View getView(int position, View convertView, ViewGroup parent) {        //        LayoutInflater inflater = LayoutInflater.from(context);        View view = null;        ViewHolder viewHolder;        if (convertView == null) {            //实例化布局            //inflate()方法参数含义            //第一个参数实例化的布局            //第二个参数为实例化的布局外层再嵌套一层ViewGroup            //第三个参数要实例化的布局是否与viewgroup产生关联            view = inflater.inflate(R.layout.listview_item, parent, false);            //创建ViewHolder内部类对象            viewHolder = new ViewHolder();            //将找到的空间保存到ViewHolder对象中的成员变量中            viewHolder.imageView = (ImageView) view.findViewById(R.id.imageView);            viewHolder.textView = (TextView) view.findViewById(R.id.textView);            //将viewHolder存储在view中            view.setTag(viewHolder);        } else {            //复用视图            view = convertView;            //重新获取ViewHolder            viewHolder = (ViewHolder) view.getTag();        }        viewHolder.imageView.setImageResource(imageId[position]);        viewHolder.textView.setText(colorsName[position]);        return view;    }    //定义一个ViewHolderlei    class ViewHolder {        ImageView imageView;        TextView textView;    }}

2.布局和子项布局、定义数据源跟前两个一样(不懂参照前两条博客),这里就不多写哈。

3.创建自定义adapter对象

MyAdapter adapter = new MyAdapter(colorName,getApplicationContext(), imageId);

4.设置适配器

ListView listView = (ListView) findViewById(R.id.listView);

5.运行的效果跟SimpleAdapter是一样的,可以参考上条博客。


谢谢大家阅读,有疑问或错误请大家指出,谢谢。

阅读全文
1 0