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

使用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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值