ListView以及自定义适配器

   ListView

  ListView顾名思义就是列表视图,用于显示多行数据的视图,

                 ListView本身属于容器视图,它需要借助适配器(adapter)来显示内容

                      listView选项添加监听事件: setonItemClickListener()

                                      其中的方法 onItemClick<parent,View view, int position, long id>();

                                                   parent 是被点击数据项所属listView的对象

                                                   view是接受被选中的是被选中数据项的TextView对象

                                                  position接收的是在适配器/list集合/spinner中的位置


适配器  :是连接适配器控件(AdapterView)和数据源的桥梁,通过它能有效地实现数据与AdapterView的分离设置,使AdapterView与数据的绑定更加简便,修改更加方便。

1.适配器控件:包含多项相同格式资源的列表,每项只显示一次。常用的适配器控件有:GridIView,ListView,Spinner,Gallery;

2.适配器对象:给适配器控件提供数据。常用的适配器有:ArrayAdapter,SimpleAdapter,SimpleCursorAdapter和自定义Adapter;


 系统提供adapter的适配器:

              首先:     声明: ArrayAdapter<String> adapter=new ArrayAdapter<String>(context, resource, textViewResourceId);

                               第一个参数 context   :表示上下文,即调用此适配器的类的对象,XXX.this

                               第二个参数 resource :即用于显示每个ListView资源的布局xml文件,系统默认的即就是:android.R.layout.simple_list_item_1

                              第三个参数 textViewResourceId:需要传入集合对象,即适配器中存放的资源

                   

             然后:  listview.setAdapter(adapter);   将适配器添加到listView中(在spinner,autocompleteTextView中也是这样)

           

            最后:假如适配器里存放的内容需要更新

                                   则利用第三个参数的对象, 首先 list.clear() 清空,  其次list.add()向里面加值,最后调用adapter.notifyDataSetChanged();将更新内容存到容器中去



自定义适配器

            (1)新建一个类 ,让它继承BaseAdapter接口

            (2) 声明构造函数及需要传入的三个参数:1,。上下文    2,。此适配器的布局xml文件id    3,适配器中需要传入的值


          下面就用代码简单解释三种适配器(三种是越来越优化的 ,所以一般只用第三种)

public class Myadapter extends BaseAdapter {
    private Context context;
    private List<String> list;
    private int ResourceId;            
    public Myadapter(Context context,int ResourceId,List<String> list)//三个需要传入的参数
    {
        this.context=context;
        this.ResourceId=ResourceId;
        this.list=list;
    }
    @Override  //返回list集合中值的个数
    public int getCount() {
        int count=0;
        if(list!=null)
        {
            count=list.size();
        }
        return count;
    }
    @Override//返回集合中对应position的值
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return list.get(position);
    }
    @Override//返回list中元素的位置position
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return 0;
    }
    @Override
     public View getView(int position, View convertView, ViewGroup parent) {

         此方法对自定义适配器来说是最重要的,其中三个参数为:

         //参数接收的position是显示数据项在集合中的位置,根据位置获得item值

     //convertView来记录消失的布局对象,直接使用在新出现的布局中

    三种写法的步骤--》获取布局文件对象--》获取视图组件对象--》对视图组件进行赋值--》返回布局文件对象

        
        /*//适配器的第一种写法
        //<1>根据布局文件的xml生成布局对象 ,其中getLayoutInflater()方法在MainActivity
        //   中没有,所以需要向上转型成activity然后再调用
        LayoutInflater inflater=((Activity)context).getLayoutInflater();
        //获得xml布局对象,第一个参数为xml布局的id,第二个为parent,但必须置空
        View view=inflater.inflate(ResourceId, null);
        //获取适配器对应位置的list值
        String item=(String)list.get(position);
        //根据布局对象获取适配器对象
        TextView textView=(TextView) view.findViewById(R.id.textView);
        //将每个对应的值写到textView中去
        textView.setText(item);
        //返回xml布局对象,
        return view;
        */

        
        
        
        //适配器的第二种写法(优化了第一种写法):实现布局对象的复用
        //因为每在屏幕上显示一个listView就会,创建一个新的布局对象,为了节省内存空间
        //利用convertView来记录消失的布局对象,直接使用在新出现的布局中
        /*if(convertView==null)
        {
            //获得xml布局对象
            convertView=LayoutInflater.from(context).inflate(ResourceId, null);
            //第二种写法
            //convertView=LayoutInflater.from(context).inflate(ResourceId, parent,false);
        }
        //根据xml布局对象获得视图对象
        TextView textView=(TextView) convertView.findViewById(R.id.textView);
        //向视图中添加信息
        textView.setText(list.get(position).toString());
        return convertView;*/
        
        
        //适配器的第三种写法,(优化了第二种),实现了不用多次findViewByid这个操作,只是将它绑定
        //在covertView中一起同步使用,
        //<1>首先创建一个内部类 用于存放视图对象;
        //<2>其次获得xml布局对象
        ViewHolder holder;
        if(convertView==null)
        {  //与第二种一样
            convertView=LayoutInflater.from(context).inflate(ResourceId, null);
            holder=new ViewHolder();
            //将获得的视图对象保存成内部类的成员变量
            holder.textView=(TextView) convertView.findViewById(R.id.textView);
            //将此内部类作为converView的tag标签
            convertView.setTag(holder);
        }
        //去除convertView中的标签
        holder=(ViewHolder) convertView.getTag();
        //设置textView的内容
        holder.textView.setText(list.get(position).toString());
        return convertView;
    }

    class ViewHolder  //此内部类是专门为第三种方法减少获取组件findViewByid(R.id.textView)而建立的
    {
        TextView textView;
    }
}

          



     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值